0

我正在查看 Guava 的Optional及其理由,我想知道在表示不能为 null 的值时是否有类似的快速失败的类会有所帮助。我找不到任何关于这个想法的讨论,所以我想我会在这里问。

我的第一次尝试是尝试保持 Guava 使用的风格,a Mandatory<T>,暴露一个静态工厂of(T t)NullPointerException如果使用 null 参数调用此方法,则抛出此方法。

我特别感兴趣的是在空处理方面确定接口方法的语义。我认为是否接受空参数是一个设计决策,应该在接口中指定,以便可以相应地设计客户端代码并避免重复前置条件检查逻辑。因此,使用此类的接口可能具有类似的方法

fire(Mandatory<Employee> employee);

客户可能会打电话

fire(Mandatory.of(unfortunateEmployee));

我怀疑 Mandatory 类型很容易找到,使用方面等在调用之前挂钩进一步检查,如果这样标记的方法参数不应该为空是绝对重要的。

我也考虑过基于注释的方法,fire(@NotNull Employee employee)但是我看到的实现需要额外的验证器连接。

那么,问题......这个想法是否已经存在于任何地方?如果没有,我是否错过了一些明显破坏它的东西?还是实现这一目标的更好主意?

4

2 回答 2

6
fire(Mandatory<Employee> employee);

如果你有一个带有这个签名的方法,你仍然可以调用fire(null); 只是你会有 a nullof typeMandatory<Employee>而不是 type Employee。您实际上根本没有提高安全性;您刚刚添加了多余的包装层。

如果你想强制一个参数是必需的,好的做法是在你的方法中使用 eg作为第一件事,如果值为 null 则Preconditions.checkNotNull立即抛出 a 。NullPointerException

于 2014-01-21T22:33:04.023 回答
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

于 2014-01-21T21:37:35.347 回答