2011-04-14 212 views
13

我有六个类都扩展相同的抽象类。抽象类有一个指向某些JNI代码的静态变量,我只希望每个实例化类都加载一次。从抽象类继承静态变量

从我所了解的结果来看,这个静态变量的实例正好是一个实例,但我想要的是每个扩展类都有自己的变量的静态实例,这个变量对于给定的子类是唯一的。我想在我的抽象类中编写一些修改和/或发布抽象类的代码。是否有可能一次完成这两件事?

所以作为一个例子,我可以用一个变量foo和一个打印foo内容的printFoo方法编写一个抽象类栏。然后我按顺序实例化fooBar1,fooBar2和fooBar3,每个扩展bar类并将foo初始化为静态块中的不同值。如果我打电话foobar1.printFoo我想打印由fooBar1构造函数初始化的foo的静态值。

这可以在java中完成吗?

+0

请关闭第一段的括号,这让我疯狂! – HXCaine 2011-04-14 18:34:51

+0

“指向某些代码的静态变量”。你能解释一点吗?你如何指向java中的代码? – mdma 2011-04-14 18:57:41

+0

我使用jocl,它是围绕OpenCL GPU代码的JNI包装。要告诉GPU该做什么,必须创建一个指向要运行的代码的CL_program,并从中产生一个表示GPU将使用的已编译内核的cl_kernel。程序和内核变量是我作为静态变量的变量,因为花费很长时间才能对GPU代码进行即时编译。但是,除了其他内容之外,我想要的是一种释放方法,即可用于释放代码的抽象类。 – drew 2011-04-14 19:09:35

回答

6

您可以近似它,但是您需要为每个子类分别使用静态变量,以阻止子类重写其他值。通过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"; 
    } 
} 
1

我有类似的问题。看起来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(); 

    } 
}