Наследование статической переменной от абстрактного класса

У меня есть полдюжины классов, которые расширяют один и тот же абстрактный класс. Абстрактный класс имеет статическую переменную, указывающую на некоторый код JNI, который я хочу загрузить только один раз за экземпляр классов.

из того, что я понимаю, это приводит к созданию ровно одного экземпляра этой статической переменной, но я хочу, чтобы каждый из расширяющихся классов имел свой собственный статический экземпляр переменной, уникальный для данного дочернего класса. Я хочу писать некоторый код в моем абстрактном классе, который изменяет и / или освобождает абстрактный класс. Возможно ли сделать обе эти вещи одновременно?

Итак, в качестве примера я могу написать абстрактный бар класса с переменной foo и методом printFoo, который печатает содержимое foo. Затем я создаю экземпляр в порядке fooBar1, fooBar2 и fooBar3, каждый из которых расширяет класс bar и инициализирует foo к различным значениям в статических блоках. Если я позову foobar1.printFoo Я хочу напечатать статическое значение foo, инициализированное конструктор fooBar1.

можно ли это сделать на java?

2 ответов


вы можете приблизить его, но вам понадобятся отдельные статические переменные для каждого подкласса, чтобы остановить перезапись подклассов друг друга. Проще всего абстрагировать это через getter getFoo Так что каждый подкласс извлекает foo из правильного места.

что-то вроде этого

abstract class Bar
{
   // you don't have to have this in the base class 
   // - you could leave out the variable and make
   // getFoo() abstract.
   static private String foo;

   String getFoo() {
     return foo;
   }

   public void printFoo() {
      System.out.print(getFoo());
   }
}

class Foo1 extends Bar
{
   static final String foo1;

   public String getFoo() {
      return foo1;  // return our foo1 value
   }

   public Foo1() {
      foo1 = "myfoo1";
   }
}


class Foo2 extends Foo1
{
   static final String foo2;

   public String getFoo() {
      return foo2;  // return our foo2 value
   }

   public Foo2() {
      foo2 = "myfoo2";
   }
}

У меня аналогичная проблема. Похоже, Java не может изолировать статические члены (атрибуты). Я закончил тем, что добавил абстрактный метод вместо атрибута:

public abstract class Abs {
    public void printX() {
        System.out.println("For " + this.getClass() + " x=" + getX());
    }

    protected abstract Integer getX();

}

public class A extends Abs {
    protected static Integer x = 1;

    @Override
    protected Integer getX() {
        return x;
    }

}

public class B extends Abs {
    protected static Integer x = 2;

    @Override
    protected Integer getX() {
        return x;
    }

}

public class test {

    public static void main(String args[]) {
        Abs a = new A();
        a.printX();
        Abs b = new B();
        b.printX();
        Abs c = new A();
        a.printX();
        b.printX();
        c.printX();

    }
}