存储给定类的所有实例的值

时间:2013-08-09 11:10:36

标签: java

我有一个名为 Foo 的类,它的一些方法依赖于依赖于时间的值 globalTime 。为了简化它,我们假设它是一个长整数,存储自程序启动以来的秒数。现在,我希望 Foo 的所有实例共享 globalTime 的完全相同的值。我当然可以创建另一个存储值的类,并让 Foo 的所有实例检索该类的值,但我只是想知道:有没有办法可以在类中执行此操作?

我正在寻找类似静态字段但能够更改其值的内容,尽管它只存储一次,而不是每个实例存储一次,因此该类中的每个实例都将为该字段共享相同的值。

我只是好奇Java中是否存在这样的东西,我并不是说它比其他任何替代方案更好或更差,所以请不要讨论想要这样做的“目的”。

5 个答案:

答案 0 :(得分:2)

因为你已被告知要制作一个静态场。答案是对的。

请注意以下事项:

  1. static字段与类相关联。创建或 销毁对象对静态场没有任何影响。
  2. static字段保留为类的范围而不是对象。
  3. 使用ClassName.fieldName访问静态字段。
  4. 这就是创建对象对它没有任何影响的原因。

答案 1 :(得分:1)

您应该使用静态字段。静态字段的值可以很好地改变,就像通常字段的值一样。

答案 2 :(得分:1)

如果您在多线程中使用globalTime,请考虑使用静态AtomicLong,这将处理同步。

答案 3 :(得分:1)

如果您的值取决于globalTime,请将static volatile字段用作:

public class Foo {
    static volatile long globalTime=System.nanoTime();

}
class B{
    public static void main(String args[]){
        System.out.println(Foo.globalTime);
    }
}

由于volatile字段可以避免编译器缓存依赖于时间字段的值。This所以回答会对你有所帮助。

答案 4 :(得分:0)

可以将它作为一个静态字段包裹在一个只调用System.nanoTime()的线程中。我没有看到这个问题。像这样的东西

    private static long timer = 0;
static {
    new Thread(new Runnable() {

        @Override
        public void run() {
            while (true) {
                timer = System.nanoTime() - timer;
            }
        }
    }).start();
}