0

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

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

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

4

5 回答 5

2

正如你已经被告知要制作一个静态字段。答案是对的。

还要注意这些事情以清除它:

  1. static字段与类相关联。创建或销毁对象对静态场没有任何影响。
  2. 一个static字段保留在类的范围而不是对象的范围内。
  3. 静态字段使用ClassName.fieldName.

这就是为什么创建对象对它没有任何影响的原因。

于 2013-08-09T15:19:16.740 回答
1

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

于 2013-08-09T11:20:12.123 回答
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 字段避免编译器缓存依赖于时间字段的值。这个SO 答案将进一步帮助您。

于 2013-08-09T11:24:17.503 回答
1

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

于 2013-08-09T11:13:24.487 回答
0

可以将它作为一个静态字段包裹在一个不断调用的线程周围System.nanoTime()。我看不出有什么问题。像这样的东西

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

        @Override
        public void run() {
            while (true) {
                timer = System.nanoTime() - timer;
            }
        }
    }).start();
}
于 2013-08-09T11:14:44.967 回答