我如何在Inner类中近似得到一个静态变量?

时间:2011-10-08 23:24:32

标签: java static abstract-class processing

我正在研究一系列所有继承自单个基础抽象类的类。

为了跟踪所有这些子类,我想实现类似GUID的东西 - 出于我的目的,它不一定是实际的GUID,只是每个都是唯一的int。子类的实例。增加的int是我一直希望使用的。

我喜欢做的是在我的抽象类中实现以下内容:

abstract class ParentObject{

   static int GUID = 0;

   //other stuff

}

此后,每个子类在其构造函数中都有myGUID = GUID++;

但是,每当我尝试这个时,我都会从Processing IDE中收到以下错误:

  

字段GUID不能声明为static;静态字段只能是   在静态或顶级类型中声明。

由于Processing处理类文件(一切都是内部类),我不能拥有静态类成员。我有哪些选择以其他方式复制此功能?

编辑:这是在Processing和Processing IDE中完成的。 ParentObject类在其自己的处理文件中

Edite2:我了解到Processing与Java不同的原因是所有Processing类都是Inner Classes。因此,我重新添加了Java标记并重新提出了问题。

2 个答案:

答案 0 :(得分:0)

静态保护方法getNextGUID()可以工作

public abstract class ParentObject{

   private static int GUID = 0;

   protected static int getNextGUID(){
       return GUID++;
   }
   //other stuff

}

不要忘记同步它/当你有多个线程时使用AtomicInteger

答案 1 :(得分:0)

好吧,然后面对它。你不能这样做。如果你真的需要它,声明一个外部类来处理这段代码,并在顶级类的构造函数中调用它。

如果你必须使用这个内部类的层次结构,那么你就不能这样做。 Java不会以你想要的方式接受它。您可以将抽象类声明为静态。

static abstract class ParentObject {

    private static int GUID = 0;

}

但我几乎肯定这对你也不适用。所以,我建议在其他地方创建一个新的外部类来处理它。

public class GUID {

    private static int GUID = 0;

    public synchronized static void increment() {
        GUID++;
    }
}

abstract class ParentObject {

    ParentObject() {

        GUID.increment();

        // constructor's stuff
    }

}

这可能会降低您的应用程序速度(取决于您实例化课程的频率),但不是很明显。