我有一个名为 Foo 的类,它的一些方法依赖于依赖于时间的值 globalTime 。为了简化它,我们假设它是一个长整数,存储自程序启动以来的秒数。现在,我希望 Foo 的所有实例共享 globalTime 的完全相同的值。我当然可以创建另一个存储值的类,并让 Foo 的所有实例检索该类的值,但我只是想知道:有没有办法可以在类中执行此操作?
我正在寻找类似静态字段但能够更改其值的内容,尽管它只存储一次,而不是每个实例存储一次,因此该类中的每个实例都将为该字段共享相同的值。
我只是好奇Java中是否存在这样的东西,我并不是说它比其他任何替代方案更好或更差,所以请不要讨论想要这样做的“目的”。
答案 0 :(得分:2)
因为你已被告知要制作一个静态场。答案是对的。
请注意以下事项:
static
字段与类相关联。创建或
销毁对象对静态场没有任何影响。 static
字段保留为类的范围而不是对象。ClassName.fieldName
访问静态字段。这就是创建对象对它没有任何影响的原因。
答案 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();
}