簡體   English   中英

為給定類的所有實例存儲值

[英]Storing a value for all the instances of a given class

我有一個名為Foo的類,該類在某些方法中依賴於依賴於時間的globalTime值。 為簡化起見,假設它是一個長整數,用於存儲自程序啟動以來的秒數。 現在,我希望Foo的所有實例都為globalTime共享完全相同的值。 我當然可以創建另一個存儲該值的類,並使Foo的所有實例檢索該類的值,但我只是想知道:是否可以從該類內部做到這一點?

我正在尋找類似靜態字段的內容,但是能夠更改其值,盡管它只存儲一次,而不是為每個實例存儲一次,因此該類的每​​個實例都將為該字段共享相同的值。

我只是對Java中是否存在類似的東西感到好奇,我並不是說這是比其他選擇更好或更壞的做法,所以請不要討論想要這樣做的“目的”。

正如您已經被告知要創建一個靜態字段。 答案是正確的。

請注意以下事項以清除它:

  1. static字段與類相關聯。 創建或銷毀對象對靜態字段沒有任何影響。
  2. static字段保留在類的范圍內,而不是對象。
  3. 靜態字段使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM