在Java中,在if条件的同一行中添加Null检查并访问整数值是否有效

在Java中,在if条件的同一行中添加Null检查并访问整数值是否有效,java,if-statement,null-check,Java,If Statement,Null Check,说 这样检查有效吗 class Person{ Integer height; integer weight; } 是,这是有效的,因为Integer是表示int的类 这就是为什么Integer可以保存空值的原因。比较p.height和p.weight也是有效的。。如果你想要干净的代码,请考虑这个问题: 高度为空实际上意味着什么?这是否意味着: 它在语义上等价于0。(那么,为什么要有它呢?将字段设置为int,并正确设置它们) 这是未知的 它是不稳定的;这是一个不希望自己的身高

这样检查有效吗

class Person{
    Integer height;
    integer weight;
}

是,这是有效的,因为Integer是表示int的类


这就是为什么
Integer
可以保存空值的原因。比较
p.height
p.weight
也是有效的。

。如果你想要干净的代码,请考虑这个问题:

高度为空实际上意味着什么?这是否意味着:

  • 它在语义上等价于0。(那么,为什么要有它呢?将字段设置为
    int
    ,并正确设置它们)
  • 这是未知的
  • 它是不稳定的;这是一个不希望自己的身高被公开的人
特别是,假设您正在检查>=1,显然您可以有一个空高度,但也可以有一个负高度。这两者在语义上有什么区别?如果没有区别,为什么允许不同的内部值组成一个行列,但这些值都可以归结为表示相同的状态?每次与这些变量交互时,您都要进行一系列检查,并进行组合爆炸来测试所有这些。不要这样做-创建一个值来表示“无效”或“未知”或“故意忽略”或任何您需要传达的内容

通常,如果您[A]尽早消除无效状态,就会产生更好的代码,这尤其意味着您不需要在每次使用这些变量时检查无效状态(这里,0和负数似乎是无效的),并且[B]使用sentinel值和NOTNULL表示唯一状态,如“未设置”或“有意不共享”

换言之:

  • 将身高和体重保密
  • 如果试图设置0或负身高或体重,他们的二传手将拒绝设置(并抛出
    IllegalArgumentException
  • 字段的类型为
    int
  • 存在各种替代状态的常数
公共类人物{
私有静态final int UNKNOWN=-1;
私有静态final int_省略=-2;
身高、体重;
公众人士(){
这个高度=未知;
这个重量=未知;
}
公共空间设置高度(内部高度){
如果(高度<1)抛出新的IllegalArgumentException(“非正高度”);
高度=高度;
}
公共无效设置高度省略(){
此高度=故意省略;
}
}

等等。现在您可以编写固有可读性的代码
null
是模糊的(您必须记录它的含义。它是指未设置、无效还是故意省略?什么?)
如果(高度==故意省略)
记录自身,这是一件好事。

是的,因为在&&operation的情况下,如果第一个条件为真,那么第二个条件之后将被检查。如果
p.height
为空,则第一个条件为false,因此不会检查其他条件


您还必须为
p.width
添加空检查。

这是否回答了您的问题?在我看来没问题,确保身高和体重得到初始化,否则你会得到一个空指针exceptionTL;DR:是的,这很好,因为一旦发现
&&
的左侧为false,将不会计算右侧。(顺便说一句,您仅涵盖高度,您可能还需要添加重量检查)是的,因为
&&
|
运算符执行
如果(x!=null&&x.someMethod())
是有效和安全的,因为如果第一部分
x!=null
的计算结果为false(x为null),则不再计算该语句的其余部分,因为无论发生什么情况,
false&……
始终为false。但是,在上面的示例中,您不检查
p.weight
是否也为空。因此,当代码达到
p.weight>=1
且权重为
null
时,您可能会得到
NullPointerException
,如果需要注意
&&
运算符的关联性和短路行为,请注意完整性的抖动+1.我发现了有关短路行为的文件。
Person p = new Person();
if (p.height !=null && p.height >= 1 && p.weight >=1 ){}
public class Person {
    private static final int UNKNOWN = -1;
    private static final int INTENTIONALLY_OMITTED = -2;
    private int height, weight;

    public Person() {
      this.height = UNKNOWN;
      this.weight = UNKNOWN;
    }

    public void setHeight(int height) {
      if (height < 1) throw new IllegalArgumentException("Non-positive height");
      this.height = height;
    }

    public void setHeightOmitted() {
      this.height = INTENTIONALLY_OMITTED;
    }
}