2014-03-24 36 views
4

此問題已被要求here。由於每答案:私人靜態決賽vs私人決賽

private final int NUMBER = 10; 

如果它不能改變,還有是每個實例一個副本沒有意義。

我的疑問是如果創建了類的實例,說一天一次,並且它持續幾秒鐘。將int(在某些情況下爲object)保存在內存中是不錯的主意嗎?

假設,可以有許多(20-30)個這樣的對象。

+6

你現在的問題是處理不成熟的優化問題。如果您真的想對此提出質疑,那麼您需要爲現有的內存有限的嵌入式設備提供真實的數字。 – skiwi

+3

同意skiwi。有關係嗎?誰在乎?垃圾收集不僅能夠處理這種「浪費」。 – Brian

+1

試想一下:'private'修飾符意味着只有(這個類的實例)能夠訪問和修改屬性。 'final'意味着在對象構造之後該值不會被修改。因此,除非你在構造函數中設置了值(最後允許的時刻),否則該值對於該類的所有實例都是相同的 - 即你可以聲明它是靜態的。 –

回答

3

您如何存儲信息很大程度上取決於它的用途。

有幾個方法,你可能需要:

私有靜態最後

這是一個不錯的選擇,如果該值將永遠不會應用程序的生命週期中進行修改。這意味着,當你創建多​​個實例時,你實際上只是存儲這個特定的變量ONCE。

私人最終

這意味着當該值可能需要對你的對象的不同實例的不同值的那些時間,但任何具體的實例將不會有它的整個對象的生命時間的修正值。

如果您正在尋找一些可能會在一定時間範圍內呈現不同數值的東西,那麼您可能會對此感興趣。

公共靜態INT GetNumber(){...}

你可以考慮另一種方法是有一個靜態方法返回你後的值。這可以很容易地處理值的變化,但是您還需要考慮在任何給定實例的整個生命週期中這種變化的影響。

希望幫助...

+0

這裏解釋了靜態與非靜態,但它是如何回答這個問題的? – skiwi

+1

我已經指出,如何存儲價值的選擇很大程度上取決於價值是用來表示 - 它是做什麼的。我還展示了三種方法,並描述了每種方法何時適用...至於確定的答案,取決於這個值是否相對於對象實例而改變 - 因此我的解釋。 –

+0

他也許還希望反映,將大對象放在靜態最終變量中是不明智的,因爲它們消耗內存資源。 Ints不會成爲一個問題,雖然... –

2

關於private final int number,你聲稱

如果它不能改變,還有是每個實例一個副本沒有意義

是絕對錯誤的。考慮以下代碼,典型的不可變類:

private final int number; 

public MyClass(int number) { 
    this.number = number; 
} 

有在JDK這種模式很多情況下,並在生產代碼類世界各地。


要回答關於性能的問題,我懷疑你可以衡量使用靜態和實例常量之間的差異。

+0

'private final int number = 10;'第二行給出編譯錯誤。 – Batty

+0

@Batty事實上,如果你把第一行改成那樣,它確實會給出這樣的錯誤,但是它的確如此。最終值必須在構造函數的末尾設置,並且一旦設置爲 –

+0

,一定不能更改,即一旦設置,就不能更改。 – Batty