2010-09-07 62 views
2

我有一個奇怪的情況,我希望能夠在內存中保存一個變量..就像我可以在JVM中插入一個全局變量。java - 如何在JVM中保留變量

這可能嗎?我記得在大學裏做了類似的事情,但是無法通過Google搜索找到它。我有一個邏輯問題,有一些人爲約束,使這個最好的解決方案。

編輯1:

我將需要更新變量的值。

編輯2:

我很欣賞這些回覆傢伙。我是一名.NET程序員,從大學以來就沒有使用過Java。再次感謝。

+0

爲什麼要結束投票?這完全是一個真正的問題。 – 2010-09-07 17:43:15

回答

5

是,使用static場:但是

public class GlobalVariableHolder { 
    public static int globalVariable; 
} 

注意的是,這被認爲是不好的做法,並可能導致那些難以調試意想不到的效果。不使用全局變量的方法是將其作爲參數或方法傳遞給需要它的地方。

如果您仍然確定需要此功能,爲了儘可能地保護您自己,請使用同步功能。更好的是,如果變量將是原始的(int,long等),您可以使用AtomicIntegergetAndAdd()addAndGet()方法。

+0

我編輯了這個問題。我需要能夠更新var。感謝您看我的問題。 – Chad 2010-09-07 17:40:53

+0

您需要注意靜態成員將在ClassLoader本地! J2EE堆棧可以將應用程序和上下文分區到他們自己的類加載器層次結構中。確保該類在頂層加載。 – Xailor 2010-09-16 15:36:31

1

你的意思是跨多個java.exe調用存在的東西,還是你的意思是一個單一的變量,將在內存中的相同位置,而不管java.exe中的哪個線程訪問它?或者您的意思是隻有在使用JRockit時才能訪問的變量?或者也許只是開發機器上的JVM,而不是其他系統上的JVM?

在第一種情況下,您需要另一種方式來存儲它,如配置文件。

在第二種情況下,就像Bozho說的那樣,使用static關鍵字。

在第三種情況下,您可能需要使用System類並確定JVM製造商(假設可以從System獲得 - 我不確定關閉了我的頭頂,自己查找API)。

在第四種情況下,你幾乎回到了配置文件。

0

它不會贏得任何獎項,但這應該工作:

 
package mypackage;

public class MyGlobal { public static String MY_GLOBAL_VAR = "my variable"; }

該JVM實例中的任何類都將能夠訪問MyGlobal.MY_GLOBAL_VAR。
已更新,以允許更新。

+0

不需要大寫 - 它不是一個常數。 – Bozho 2010-09-07 17:55:09

+0

確實如此,但在我編輯它之前它是不變的:) – 2010-09-07 21:49:06

2

通常情況下,您最終會將這些東西存儲在某種全局類中 - 這是一個可以從任何地方訪問並具有受控數量的實例的類。

單身人士通常用於此。如果你查看單身人士的模式,並將你的變量存儲在這個單身人士中(添加一個setter和一個getter),你就在前進。

這樣做(與公共靜態變量相反)會爲您提供某種級別的訪問控制和可跟蹤性 - 例如,如果發現獲取的結果不可預知,則可以將調試語句放在getter中。

從長遠來看,setter和getters以及singleton都是不好的代碼氣味,但是不會像可設置的公共變量那樣糟糕。

稍後,您可能想要將操縱該變量的代碼移動到單例對象中,並可能將單例轉換爲您可以通過IOC獲取的東西,但單身人士比起使用公共靜態更適合開始。

+0

投票贊成單身人士! – CoolBeans 2010-09-07 17:48:40

+0

如果只存儲數據,我不會說需要實現一個單例。 – Bozho 2010-09-07 17:54:40

+0

@Bozho一個可設置的全局變量是你可能做的最糟糕的事情之一,至少有一個單例讓你可以控制變量。一個正確實現的單例(其中操縱變量的代碼放置在單例對象本身中)要好得多。我的假設是,創建單身人士將給乍得一個放置一些代碼的地方,他的設計技能將會發展。創建一個全局變量將導致他的代碼出血重複和複製/粘貼。我甚至沒有提到可能發生的可能的線程問題。 – 2010-09-07 18:00:56