一个非常好的跟进问题.我认为null
一个真正特殊的值,如果一个方法可能返回null
它必须在Javadoc中明确记录(@return some value ..., or null if ...
).在编码时我是防御性的,并假设一种方法可能会返回,null
除非我确信它不能(例如,因为Javadoc这样说.)
人们意识到这是一个问题,并且建议的解决方案是使用注释以可以自动检查的方式陈述意图.请参阅JSR 305:软件缺陷检测的注释,JSR 308:Java类型的注释和JetBrain的Nullable How-To.
您的示例可能如下所示,并被IDE,编译器或其他代码分析工具拒绝.
@NotNull public Object methodWhichCannotReturnNull(int i) throws Exception { return null; // this would lead to a compiler error! }
您可以使用Option
类型,这非常类似于具有零个或一个元素的列表.返回类型Option
表示该方法可以返回一个Object
,或者它可以返回一个特殊的类型值None
.此类型可替代使用null和更好的类型检查.
例:
public OptionparseInt(String s) { try { return Option.some(Integer.parseInt(s)); } catch (Exception e) { return Option.none(); } }
如果你始终如一地使用它,你可以打开IDE无效警告,或者只使用grep,null
如果你使用Option.none()
你想要使用null
文字的任何地方,就不应该出现在你的代码中.
Option
标准的Scala,它Maybe
在Haskell中调用.上面的链接是一个名为Functional Java的库,包含它.该版本实现了该Iterable
接口,并具有monadic方法,可以让您很好地组合.例如,在以下情况下提供默认值0 None
:
int x = optionalInt.orSome(0);
你可以替换这个......
if (myString != null && !"".equals(myString))
......有了这个,如果你有Option
......
for (String s : myOptionString)