java - 在Java中的if条件的同一行中添加Null检查并访问Integer值是否有效
问题描述
说
class Person{
Integer height;
integer weight;
}
像这样检查是否有效?
Person p = new Person();
if (p.height !=null && p.height >= 1 && p.weight >=1 ){}
解决方案
没关系,但请注意,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)
记录本身,这是一件好事。
推荐阅读
- python - 如何根据嵌入的数组更改嵌入页脚?
- html - chrome 扩展事件处理程序中的错误:TypeError:无法设置 null 的属性(设置“值”)
- python - 使用 PyTextNow 发送消息时出现 FailedRequest 服务器错误 520
- python - 如何为参数分配数据类型,如果该数据类型与我分配的不同会引发错误?
- arrays - char * vs char[] 等等
- neural-network - 在 LSTM(或一般的神经网络)的 model.summary() 中,“输出形状”下显示的最后一个数字是该层中的神经元数?
- python - Sqlite3 更改位置列(重新排序)
- matlab - Matlab - 部署使用自定义工具箱的 exe
- foursquare - Foursquare PlaceAPI 中的 QPS 是什么意思?
- java - 如何在不访问类或类加载器的情况下从 jar 中获取文件?