Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:检查属性是否设置为int和Integer_Java_Types - Fatal编程技术网

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

Java:检查属性是否设置为int和Integer,java,types,Java,Types,假设我有这样一个对象: Public Class Test{ int a; } 在程序中的某个时刻,我想检查是否设置了属性a。我知道,如果我使用Integer而不是int作为属性的类型,我可以执行如下操作: if(test.a!=null) ...; public class Test { private static final int MAGIC_NR = Integer.MIN_VALUE; private int var = MAGIC_NR; //set

假设我有这样一个对象:

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

if(test.a!=null)
    ...;
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;
   }
}
但是如果我把int保留在那里,用它来检查:

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


因此,在这里使用int是否合适,或者始终首选整数?

这完全取决于您,两者都可以(前提是“unset”和
<0实际上在您的程序中是相同的意思)。我知道这不是一个很好的答案,但这是事实。:-)如果“unset”和
0
不是同一个意思,那么
Integer
就更有说服力了,这样您就可以正确区分它们了

下面是您的评论:

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


是的,
int
总是按照初始化为
0

从约定的角度来看,这没什么,不过您可能希望使用常量来表示未设置的值:

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

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

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

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

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

如果你想和一个神奇的数字进行比较,我建议不要使用像默认值
0
那样常见的值。使用一些您在程序中很难找到的东西,比如Integer.MIN_值,并在setter中加以防范

在这种情况下,您可以执行以下操作:

if(test.a!=null)
    ...;
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;
   }
}

是的,这很有帮助。我需要确认,如果“unset”和0相同,那么使用int就可以了,在其他情况下,最好使用Integer。非常感谢。你对静电的理解是错误的。在您的示例中,
Test
的所有实例将共享相同的
Test.a
值。这是了解静态成员的一个很好的起点:正如我所说,我不确定,但感谢您纠正我的错误。这是从另一个类引用int的一种方法。也许这个问题还不够清楚,我想这就是他在问的。