3

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

Public Class Test{
    int a;
}

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

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

但是,如果我将 int 保留在那里并使用它来检查:

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

一个问题是我无法区分零值和未设置值,但在我的程序中它们是相同的,因为有效值都不同于 0。此外,使用 int 简化了我以后需要做的事情开启,例如使用 == 进行比较。

那么在这里使用 int 会很好,还是总是首选 Integer ?

4

4 回答 4

6

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

在下面回复您的评论:

我只是想确认未设置的 int 将始终等于0

是的,根据 JLS 的第 4.12.5 节,始终初始化int为。0

于 2012-11-03T13:20:22.137 回答
3

0当声明未指定值时(如上面的代码片段) , int 原始类型将被初始化。

如果状态“设置/取消设置”(而不是值)对您的程序很重要,您可以使用整数(正如您提到的)、布尔脏标志或“幻数”。

如果您想与一个幻数进行比较,我建议不要使用与 default value 一样常见的东西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;
   }
}
于 2012-11-03T13:36:21.650 回答
2

从约定的角度来看这很好,尽管您可能希望使用一个常量来表示未设置的值:

public static final int UNSET = 0;
...
if(test.a == UNSET) {
....
}
于 2012-11-03T13:23:47.790 回答
-1

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

    public class Test {
        public static int a;
    }

然后通过引用Test类来引用它,

    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。希望有帮助。

于 2012-11-03T13:33:14.647 回答