#java #inheritance #static #abstract-class
#java #наследование #статический #абстрактный класс
Вопрос:
У меня есть полдюжины классов, которые все расширяют один и тот же абстрактный класс. Абстрактный класс имеет статическую переменную, указывающую на некоторый код JNI, который я хочу загружать только один раз за создание экземпляра классов.
Насколько я понимаю, это приводит к созданию ровно одного экземпляра этой статической переменной, но я хочу, чтобы у каждого из расширяющихся классов был свой собственный статический экземпляр переменной, уникальный для данного дочернего класса. Я хочу написать некоторый код в моем абстрактном классе, который изменяет и / или освобождает абстрактный класс. Возможно ли сделать обе эти вещи одновременно?
Итак, в качестве примера я могу написать абстрактный класс bar с переменной foo и методом printFoo, который печатает содержимое foo . Затем я создаю экземпляры по порядку fooBar1, fooBar2 и fooBar3, каждый из которых расширяет класс bar и инициализирует foo различными значениями в статических блоках. При вызове foobar1.printFoo
я хочу напечатать статическое значение foo, инициализированное конструктором fooBar1.
Можно ли это сделать на java?
Комментарии:
1. Пожалуйста, закройте скобку в вашем первом абзаце, это сводит меня с ума!
2. a
static variable pointing to some code
. Можете ли вы объяснить это немного подробнее? Как вы указываете на код на Java?3. Я использую jocl, который является оболочкой JNI вокруг кода OpenCL GPU. Чтобы сообщить графическому процессору, что делать, нужно создать CL_program, который указывает на код, который нужно запустить, и из этого сгенерировать cl_kernel, представляющий скомпилированное ядро, которое будет использовать графический процессор. У меня есть статические переменные program и kernel, потому что для своевременной компиляции кода GPU требуется слишком много времени. Но я хочу, среди прочего, метод освобождения абстрактного класса, который можно использовать для освобождения кода.
Ответ №1:
Вы можете приблизить это, но вам понадобятся отдельные статические переменные для каждого подкласса, чтобы остановить перезапись подклассами значений друг друга. Проще всего абстрагировать это с помощью 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";
}
}
Ответ №2:
У меня похожая проблема. Похоже, 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();
}
}