【问题标题】:Why assign a null value? [duplicate]为什么要分配一个空值? [复制]
【发布时间】:2018-03-13 02:10:13
【问题描述】:

我一直在上课并在学习编程时打字,在一些不同的课程中,他们说这就是你声明空变量的方式(如果我记得正确的话,java 和 Kotlin 是“无”不完全相同)。

但我读到或学到的所有东西都说不要这样做。 为什么要这样做,或者是否有合法用途?

REV 1.0 以下

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

请不要改变我的问题,而是让我了解如何以不同的方式看待它或重新构建或提出更好的问题。

【问题讨论】:

  • 原因if (root == null) { /* do cool stuff */ }.
  • null 是一种将 nothing 分配给变量的方法。它可以用于默认值或者只是缺少某些东西。显然,如果您处理可能是null 的变量总是很危险的,因为它们不引用任何对象。我的意思是,如果你有一个像buyApple() 这样的方法,它应该返回一个Apple,如果超市已经关门并且没有苹果,你会怎么做?您可以返回null(在这种特定情况下Optional 可能会更好)。您的程序逻辑显然需要处理这种情况。如果你错过了,你会得到例外。

标签: java null kotlin


【解决方案1】:

用于在外部范围内声明变量,例如 Java 中未在声明时显式分配的任何 Object 字段默认为 null

还取消引用某些东西以允许垃圾收集

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

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

【讨论】:

    【解决方案2】:

    null 有多种合法用途;尽管有同样多(如果不是更多)非法的。

    想到一对情侣:

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

    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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 2015-04-16
      • 2016-05-08
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多