我正在查看Guava的Optional类和its justification,我想知道在表示不能为null的值时,类似的类是否快速失败会有所帮助。我找不到任何关于这个想法的讨论,所以我想我会在这里问。
我的第一次尝试将尝试保留Guava使用的样式,Mandatory<T>
,暴露静态工厂of(T t)
。如果使用null参数调用,则此方法抛出NullPointerException
。
我特别感兴趣的是在空处理方面确定接口方法的语义。我认为是否接受空参数是一个应该在接口中可以指定的设计决策,以便可以相应地设计客户端代码并避免重复前置条件检查逻辑。因此,使用此类的接口可能具有类似
的方法 fire(Mandatory<Employee> employee);
,客户可以致电
fire(Mandatory.of(unfortunateEmployee));
我怀疑强制类型很容易找到使用方面等来在调用之前挂钩进一步检查,如果这样的标记方法参数不应该为空是绝对重要的。
我还考虑了基于注释的方法,例如fire(@NotNull Employee employee)
,但我看到的实现需要额外连接验证器。
所以,问题......这个想法在任何地方都存在吗?如果没有,我是否错过了一些明显破坏它的东西?或者更好的想法来实现这个目标?
答案 0 :(得分:6)
fire(Mandatory<Employee> employee);
如果你有一个带有此签名的方法,你仍然可以调用fire(null)
;只是你有null
类型Mandatory<Employee>
而不是Employee
类型。你根本没有提高安全性;你刚刚添加了一个冗余的包装层。
如果您想强制要求参数,那么最好使用例如Preconditions.checkNotNull
作为方法中的第一件事,如果值为null,则立即抛出NullPointerException
。
答案 1 :(得分:1)
添加一个抛出NPE的Mandatory.of方法
使用你的T变量已经抛出了NullPointerException,那么重点是什么?
如何指定参数是合约的一部分?
Javadoc已经使用了很长时间。
是的,但我想强制执行。
你手上有太多时间。除此之外......
@NotNull
是“新方式”。您可以使用AOP自动为所需方法连接非空验证。以下是一些很棒的实现:
http://blog.solidcraft.eu/2010/09/getting-rid-of-null-parameters-with.html http://janistoolbox.typepad.com/blog/2009/12/aopvalidationnotnull.html