Java:检查属性是否使用int和Integer设置

时间:2012-11-03 13:19:12

标签: java types

假设我有一个这样的对象:

Public Class Test{
    int a;
}

在我的程序中的某个时刻,我想检查是否设置了属性a。我知道如果我使用Integer而不是int作为属性的类型,我可以做类似的事情:

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

但是如果我把int保留在那里而是用它来检查:

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

一个问题是我无法区分零值和未设置值,但在我的程序中它们是相同的,因为有效值都不同于0.此外,使用int简化了我需要的东西稍后再做,比如使用==。

进行比较

那么在这里使用int会没用,或者总是首选Integer?

4 个答案:

答案 0 :(得分:6)

这完全取决于你,或者很好(提供“未设置”并且0 真的在你的程序中意味着相同的事情)。我意识到这不是一个答案,但这是事实。 :-)如果“未设置”并且0并不意味着相同的事情,那么Integer会更强烈地争论,因此您可以正确地区分它们。

重新评论以下内容:

  

我只是想确认未设置的int总是等于0

是的,int始终按Section 4.12.5 of the JLS初始化为0

答案 1 :(得分:3)

当声明未指定值时,int基元类型将初始化为0(如上面的代码片段中所示)。

如果状态“set / unset”(而不是值)对您的程序很重要,您可以使用整数(如您所述),布尔脏标志或“幻数”。

如果你想与一个幻数进行比较,我建议不要像默认值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;
   }
}

答案 2 :(得分:2)

从惯例的角度来看,这很好,尽管你可能想要使用常量来表示未设置的值:

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

答案 3 :(得分:-1)

这取决于你想要如何访问它,我不完全清楚这是如何工作的,但我的理解是静态变量不需要实例化,它已经是一个对象所以你可以尝试这样的东西。

    public class Test {
        public static int a;
    }

然后参考Test class

来引用它
    if (Test.a != null) {}

当然,你可以简单地创建一个Test类的对象,你想要引用它。

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

最后我的第三个解决方案是将它传递给新类的构造函数。

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

然后当你创建该类的对象时,你必须将int传递给构造函数,或者使用多个构造函数。至于你的上一个问题,使用你想要的东西,我很少使用Integer类,除非我需要使用静态方法或者沿着这些方法。我更喜欢使用int。希望有所帮助。