解除引用可空对象的模式有哪些?

时间:2012-02-19 00:23:52

标签: java design-patterns

是否有任何类似于Groovy safe navigation operator的模式?这是一个空值确实有意义并且允许抛出NullPointerException的地方是错误的。

除了检查null之外,还有哪些其他选项? String类提供static method来取消引用可能为null的值,但除Objects类之外似乎没有太多使用此模式。谷歌的Guava项目确实有一个Optional类,但这需要调用者提供一个默认值,与安全导航操作符相比看起来太多了,并且当你只想让它在大多数时候都为空时。看起来像这样:

com.google.common.base.Optional.of(fooBar).
    or(org.mockito.Mockito.mock(FooBar.class));

Scala中的null object patternoption monad不是我想要的,或者是将这些运算符添加到Java的未来版本中的建议,我正在寻找可以在Java中应用的模式现在

2 个答案:

答案 0 :(得分:3)

不。只是一个很好的老板,如果 - 其他。如果感觉更像图案,您可以使用三元运算符。你可以使用匿名类和Callable等方式来制作一些具有模仿性的东西,但它在Java中会非常非常难看。

答案 1 :(得分:2)

“安全”导航操作符在我看来是一个非常糟糕的主意,因为它可以抑制异常并允许开发人员使用错误代码。

基本上只有三种情况需要考虑:

  • 如果你有一个空的地方不应该是那么你有一个错误,快速和大声失败。 NullPointerException是一种非常好的方法,尽管有些人认为你应该有更早检测到杂散null的测试。请注意Fail-Fast是构建健壮系统的一个非常重要的原则,因此您应该学会喜欢NullPointerExceptions。他们在那里指导您构建更好的软件。您应该通过修复代码来修复NPE,而不是忽略/禁止它!
  • 如果允许null但需要特定处理(例如默认值),那么您应该在代码中明确。为此编写if / else null检查是非常好的做法,否则你可以使用一个自己处理null case的辅助函数。
  • 如果允许null但不需要特定处理,那么您不需要做任何事情。就像往常一样传递它。