2012-11-03 58 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; 
    } 
}