缺少Java的价值

SOS*_*SOS 10 java

可以在Java中使用什么语句来表示变量的缺失值.例如,我想写一个代码:

if (a>=23)
 income = pay_rate;
else 
 income is missing;
Run Code Online (Sandbox Code Playgroud)

mis*_*tor 14

这个帖子中有很多不好的建议.首先让我解释为什么你应该采取一些建议的方法.

1.使用包装器类型和null

Integer income = null;
if (a >= 23) {
  income = payRate; 
}
Run Code Online (Sandbox Code Playgroud)

Java具有自动拆箱功能.如果你income在Java必须自动拆箱的地方意外使用它会怎么样?编译器无法捕获此错误,您的代码将在运行时爆炸.

其次,收入的"可空性"不属于income类型.因此,程序员在null每次使用时都要小心检查它.如果他忘记执行此检查,编译器将不会抱怨,但您将NullPointerException在运行时获得.

2.使用标记值表示异常情况

int income = Integer.MAX_VALUE;
if (a >= 23) {
  income = payRate;
}
Run Code Online (Sandbox Code Playgroud)

这种方法具有方法的第二个缺点null.更糟糕的是,在这种情况下,即使在错误的条件下,计算也将继续进行,而不是抛出异常,因为这Integer.MAX_VALUE是有效的int,导致可能的灾难性后果.


那你该怎么处理呢?

使用以下数据类型:

  • 具有"可空性"的类型.
  • 不涉及上述两种方法中的条件检查.
  • 在编译时确保数据未被非法访问.

Maybe(也称为Option)适合该法案.(@Bahribayli已经建议过了.我正在扩展它.)请参阅此处的数据定义.

这就是你如何在你的情况下使用它:

Maybe<Integer> income = Nothing.value();
if (a >= 23) {
  income = Just.of(payRate);
}
Run Code Online (Sandbox Code Playgroud)

有一个名为库Java功能提供这种抽象.如果您对此数据类型的使用有任何疑问,我将很乐意回答.

  • @ Raze2Dust,除非你在高性能密集型领域工作,否则没有什么可担心的.我主要是一个Scala开发人员(也是一个JVM语言),并且`Maybe`恰好是处理"可选性"的方式. (3认同)

das*_*ght 6

您正在寻找一个,而不是一个语句,而且该值是null.您不能分配原始数据类型的null变量,例如和,但您可以将它与它们的盒装对应物一起使用 - ,等等.intdoubleIntegerDouble

当您这样做时,null在访问它们之前应该小心检查您的值.否则,无辜的外观if (pay_rate > 100)可能会抛出空引用异常.

  • 在java中,"内置函数"一词是[*primitives*](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html) (2认同)

Jon*_*n W 2

Integer income = null;
if (a >= 23) {
  income = payRate; // underscores are generally considered bad convention in Java
}
Run Code Online (Sandbox Code Playgroud)