Java中的空安全解除引用如何?在Groovy中使用Maybe monad

Sat*_*ish 2 java monads null groovy nullpointerexception

我正在研究从Objective C移植到Java的代码库.没有nullchecks的方法链接有几种用法

dog.collar().tag().name()
Run Code Online (Sandbox Code Playgroud)

我正在寻找类似于安全解除引用运算符的东西?在Groovy而不是nullchecks

dog.collar?.tag?.name
Run Code Online (Sandbox Code Playgroud)

这导致了可能monad有Nothing的概念而不是Null.但是当我访问值时仍然没有解决链接问题的Nothing的所有实现都会抛出异常.我做了Nothing返回一个模拟,它的行为类似于NullObject模式.但它解决了链式问题.

Nothing的实现有什么问题吗?

public class Nothing<T> implements Maybe<T> {

    private Class<T> klass;

    public Nothing(Class<T> klass) {
        this.klass = klass;
    }

    @Override
    public T value() {
        return mock(klass, Mockito.RETURNS_DEEP_STUBS); 
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知

  1. 在代码中使用模拟库感觉很奇怪
  2. 它不会在第一个空值处停止.
  3. 由于空引用或名称实际为空,我如何区分null结果?如何在Groovy代码中区分?

Dav*_*ave 7

我不建议只检查空值.真的,我建议甚至不要返回null,而是抛出异常.

在任何一种情况下,你都不会通过这种空对象方法更快地编写代码,而且我认为你最终会因为想要复制不同编程语言的特性而混淆某人.我认为你应该适应你正在使用的语言.