首页 > 解决方案 > 在Java中的if条件的同一行中添加Null检查并访问Integer值是否有效

问题描述

class Person{
    Integer height;
    integer weight;
}

像这样检查是否有效?

Person p = new Person();
if (p.height !=null && p.height >= 1 && p.weight >=1 ){}

标签: javaif-statementnull-check

解决方案


没关系,但请注意,NullPointerException如果 ifp.weight为空,这仍然会崩溃。如果您想要干净的代码,请考虑以下问题:

实际上是什么height is null意思?是否意味着:

  • 它在语义上等同于 0。(那么,为什么要有它?制作你的 fields int,并正确设置它们)。
  • 这是未知的。
  • 未设置;这是一个不想公开身高的人。

特别是,如果您正在检查 >= 1,显然您可以有一个空高度,但也可以有一个负高度。这两者之间的语义区别是什么?如果没有区别,你为什么要允许一系列不同的内部值,但都归结为代表相同的状态?每次与这些变量交互时,您都在注册进行一系列检查,并通过组合爆炸来测试所有这些。不要这样做 - 创建一个值来表示“无效”或“未知”或“故意省略”或您需要传达的任何内容。

通常,如果您 [A] 尽早消除无效状态,通常会导致更好的代码,这尤其意味着您不需要每次都检查无效状态(这里,0 和负数似乎是无效的)使用这些变量,并且 [B] 使用标记值而不是 null 来指示唯一状态,例如“未设置”或“故意不共享”。

换句话说:

  • 将身高和体重设为私密
  • IllegalArgumentException如果尝试设置 0 或负的身高或体重,他们的二传手将拒绝设置(并改为投掷)。
  • 字段的类型int
  • 各种备用状态存在常数。
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;
    }
}

等等。现在您可以编写本质上可读的代码;null是模糊的(你必须记录它的含义。它是否意味着未设置、无效或故意省略?什么?),if (height == INTENTIONALLY_OMITTED)记录本身,这是一件好事。


推荐阅读