为什么要指定空值?

时间:2018-03-13 02:10:14

标签: java null kotlin

我一直在上课并输入学习编程,在一些不同的课程中他们说这是你如何声明一个空变量(java和Kotlin如果我记得正确的python是一个" none"不完全是相同)。

但我阅读或学习的所有内容都表明不会这样做。 为什么这样做或是否合法使用?

REV 1.0以下

我编辑并回滚了一些这个问题,因为在进一步深入研究主题之后没有一个与null非常相似。

请不要更改我的问题,请对我如何以不同方式查看或重新构思或提出更好的问题发表评论。

2 个答案:

答案 0 :(得分:1)

用于在外部作用域中声明变量,例如Java中未在声明中显式指定的任何Object字段默认为null

还要废除某些内容以允许垃圾回收

建议避免空值,因为追逐NPE错误是JVM开发中的一个重要时间

就个人而言,除了Nil之外,我还喜欢Try / Success或Option / Some / None的Scalas模型

答案 1 :(得分:1)

null有多种合法用途;虽然有很多(如果不是更多)非法的。

作为一对想起来的情侣:

可选的依赖项。在下面的课程;如果在施工时提供非null Notifier;然后,当事情发生时,这用于通知。但是,如果没有doThing可用(或必需),则该课程仍然可以使用Notifier方法。

class ThingDoer {
    private final Notifier notifier;

    ThingDoer(final Notifier notifier) {
        this.notifier = notifier;
    }

    void doThing() {
        // Doing some stuff.
        if (this.notifier != null) {
            this.notifier.notify("Did thing");
        }
    }
}

缓存是另一种情况(如果已经计算了缓存值,则使用缓存值,否则从头开始查找 - 此处不考虑线程安全性......)。同样的概念适用于懒惰的东西;在第一次请求之前,您可以将值保持为null,然后保持可用,以避免重新计算后续请求。

class CachedLookup {
    private Result cachedResult = null;

    Result getResult() {
        if (this.cachedResult != null) {
            return this.cachedResult;
        }

        this.cachedResult = this.getResultInternal();
        return this.cachedResult;
    }

    private Result getResultInternal() {
        // Whatever complex stuff here...
        return new Result();
    }
}