Aeo*_*eon 1 java methods null design-patterns
我有一个方法,不允许null作为参数.我应该检查方法中的参数是否为null并抛出IllegalArgumentException?如果是的话,我将不得不在很多方法中实现该检查,它看起来很难看.那么最好的方法是什么?
那么,这是个人偏好的问题.我会说:是的,你应该.如果您在第一次访问对象时发现存在问题而不是获取异常,则可能会更容易调试,可能在数千行之外的其他方法中.(但扔一个NullPointerException而不是IllegalArgumentException.)
但你必须手动检查.当然,您可以编写辅助方法或使用Guava Preconditions:
public void test(final String string) {
Preconditions.checkNotNull(string); // will throw a NullPointerException if string is null
}
Run Code Online (Sandbox Code Playgroud)
编辑:特别是如果你编写一个供他人使用的API,告诉人们你是否期望非空值或null是否合适是有帮助的.你可以这样做使用@Nullable,@Nonnull(每两个变量或字段),@ParametersAreNonnullByDefault以及@ParametersAreNullableByDefault注释(均为每类,包或方法)位于javax.annotation(未JDK的一部分).
编辑2:好的,为什么我建议使用NPE而不是IAE?首先,它是处理这个问题的标准方法.JDK这样做,像Guava这样的重要库这样做,而且关于Java,Effective Java的唯一一本书推荐它(第60项).但我知道,这不是一个有效的论点.在@fabian提到的这个答案中,@ Jason Cohen赞成IAE.他的论点是:
null.其次,我不认为这些期望在这里是一个有效的论点.如果每个人都在null争论NPE ,那么这些期望就会改变.事实上很多人误解了一个行为并不意味着这种行为是错误的.null价值.由于NPE显然是为处理null价值而设计的,为什么你会选择IAE呢?;)null和非法价值没有区别. 这里是一个区别.说实话:我不喜欢这个.我非常欣赏锡兰null作为Null班级唯一实例的方法.(在我的Java代码中,我通常使用Guava的Optional类来表示可以为空的变量.)但Java作者做出了明确的决定:这 null是一个非常特殊的东西,与所有其他值不同.这就是为什么它应该以不同的方式处理的原因 - 例如,有一个不同的例外.IAE表示值存在问题:可能太短,太长,负,正,零.NPE表明根本没有价值.我更喜欢NPE的另一个原因是一致的行为.从调用者的角度来看 - 假设我不知道方法实现 - 我必须假设null一旦访问此参数,调用带参数的方法将导致NPE.在手动检查时抛出NPE不会改变此行为.它只是改善了引发异常的时刻.
此外,使用NPE允许我以非常简单的方法省略手动检查,例如:
public void test(@Nonnull final String string) {
string.toString();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3196 次 |
| 最近记录: |