[英]Storing a value for all the instances of a given class
我有一個名為Foo的類,該類在某些方法中依賴於依賴於時間的globalTime值。 為簡化起見,假設它是一個長整數,用於存儲自程序啟動以來的秒數。 現在,我希望Foo的所有實例都為globalTime共享完全相同的值。 我當然可以創建另一個存儲該值的類,並使Foo的所有實例檢索該類的值,但我只是想知道:是否可以從該類內部做到這一點?
我正在尋找類似靜態字段的內容,但是能夠更改其值,盡管它只存儲一次,而不是為每個實例存儲一次,因此該類的每個實例都將為該字段共享相同的值。
我只是對Java中是否存在類似的東西感到好奇,我並不是說這是比其他選擇更好或更壞的做法,所以請不要討論想要這樣做的“目的”。
正如您已經被告知要創建一個靜態字段。 答案是正確的。
請注意以下事項以清除它:
static
字段與類相關聯。 創建或銷毀對象對靜態字段沒有任何影響。 static
字段保留在類的范圍內,而不是對象。 ClassName.fieldName
訪問。 這就是為什么創建對象對其沒有任何影響的原因。
您應該為此使用靜態字段。 靜態字段的值可以像通常字段的值一樣很好地更改。
如果在多線程中使用globalTime
,請考慮使用靜態AtomicLong ,它將處理同步。
如果您的值取決於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);
}
}
由於易失性字段避免了編譯器緩存依賴於時間字段的值。 這樣的答案將進一步為您提供幫助。
可以將它作為包裹在一直調用System.nanoTime()
的線程周圍的靜態字段。 我認為沒有問題。 像這樣
private static long timer = 0;
static {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
timer = System.nanoTime() - timer;
}
}
}).start();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.