【问题标题】:Java: Checking if an attribute is set with int and IntegerJava:检查是否使用 int 和 Integer 设置了属性
【发布时间】:2012-11-03 13:19:11
【问题描述】:

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

Public Class Test{
    int a;
}

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

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

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

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

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

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

【问题讨论】:

    标签: java types


    【解决方案1】:

    这完全取决于您,或者都可以(前提是“未设置”和0真的在您的程序中表示相同的意思)。我意识到这不是一个答案,但这是事实。 :-) 如果 "unset" 和 0 不是同一个意思,那么 Integer 会更有说服力,所以你可以正确区分它们。

    在下方回复您的评论:

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

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

    【讨论】:

    • 嗯,这有帮助。我需要确认如果“未设置”和 0 相同,那么使用 int 就可以了,而在其他情况下,最好使用 Integer。非常感谢。
    【解决方案2】:

    当声明未指定值时(如上面的代码 sn-p),int 原始类型将被初始化为 0

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 你对static的理解是错误的。在您的示例中,Test 的所有实例都将共享相同的 Test.a 值。这是了解静态成员的一个很好的起点:docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
        • 好吧,就像我说的,我不确定,但感谢您纠正我。这是从另一个类引用 int 的一种方法。也许这个问题还不够清楚,我以为他在问。
        猜你喜欢
        • 1970-01-01
        • 2011-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-31
        • 1970-01-01
        • 2015-10-27
        • 2011-11-03
        相关资源
        最近更新 更多