2012-11-03 56 views
3

假設我有一個對象是這樣的:的Java:檢查是否屬性被設置爲int和Integer

Public Class Test{ 
    int a; 
} 

我在程序某些時候,我想檢查屬性是否設置。我知道,如果我用整型的不是int,因爲我可以做類似屬性的類型:

if(test.a!=null) 
    ...; 

但是如果我把INT那裏代替,而該檢查:

​​

一個問題是我不能區分零值和未設置值,但在我的程序中它們是相同的,因爲有效值都不同於0.另外,使用int可以簡化我需要的東西稍後再做,比如使用==進行比較。

那麼在這裏使用int會好嗎,還是總是首選Integer?

回答

6

這完全取決於你,要麼罰款(提供「未設置」和0真的意味着在您的程序中同樣的事情)。我意識到這不是一個很大的答案,但這是事實。 :-)如果「未設置」和0並不意味着同樣的事情,那麼Integer會更強烈地爭論,所以你可以正確區分它們。

重新下方的評論:

我只是想確認未設置INT將始終等於0

是,int總是初始化爲0,每Section 4.12.5 of the JLS

+0

好耶這有助於。我需要確認如果「unset」和0是相同的,那麼使用int就很好,而在其他情況下,最好使用Integer。非常感謝。 –

2

這是從慣例的角度很好,雖然你可能會想用一個常數,象徵着未設置值:

public static final int UNSET = 0; 
... 
if(test.a == UNSET) { 
.... 
} 
+0

關於常數的好處。謝謝。 –

-1

這取決於你怎麼想訪問它,我並不完全清楚在這個如何工作,但我的理解是一個靜態變量不需要實例化,它已經是一個對象,所以你可以嘗試這樣的事情。

public class Test { 
     public static int a; 
    } 

然後參考其參照測試類,

if (Test.a != null) {} 

當然,或者你可以簡單地創建在任何你想引用變量的測試類的對象。

Test test = new Test(); 
    if (test.a != null) {} 

最後我的第三個解決方案是將它傳遞給新類的構造函數。

public class NewCLass { 
     int newInt; 
     public NewClass(int num1) { 
      this.newInt = num1; 
     } 
    } 

那麼當你創建該類的一個對象,你不得不一個int傳入構造器,或者使用多張構造函數。至於你的最後一個問題,使用你想要的東西,我很少使用Integer類,除非我需要使用它的靜態方法或沿着這些線的東西。我更喜歡用int。希望有所幫助。

+0

你對靜態的理解不正確。在你的例子中,'Test'的所有實例將共享'Test.a'的相同值。這是學習靜態成員的一個很好的起點:http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html – maasg

+0

就像我說的,我不確定,但感謝您糾正我。這是從另一個類中引用int的一種方法。也許這個問題還不夠清楚,我想那是他問的問題。 –

3

當聲明沒有指定值(如上面的代碼片段)時,int基元類型將被初始化爲0

如果狀態「set/unset」(而不是值)對您的程序很重要,您可以使用Integer(如您所述),布爾型髒標誌或「幻數」。

如果你想比較一個神奇的數字,我會建議反對像默認值0一樣普通的東西。使用你在程序中幾乎找不到的東西,比如Integer.MIN_VALUE,並在你的setter中防止它。

在這種情況下,你可以這樣做:

public class Test { 
    private static final int MAGIC_NR = Integer.MIN_VALUE; 
    private int var = MAGIC_NR; //set it to the magic nr at declaration time 

    public boolean isVarSet() { 
     return var == MAGIC_NR; 
    } 

    public void setVar(int value) { 
     if (value == MAGIC_NR) throw new IllegalArgumentException("Invalid value for VarX"); // guard against setting this value - otherwise you're in trouble 
     var = value; 
    } 

    public int getVar() { 
     return var; 
    } 
}