当前位置: 首页 > 面试题库 >

为什么checkNotNull()没有用@Nonnull注释

邢献
2023-03-14
问题内容

我发现不方便之处在于checkNotNull()番石榴中的前提条件没有标注@Nonull注释。考虑以下示例:

State(Set<Model> models, Set<Variation> variations) {
  this.models = checkNotNull(models);
  this.variations = checkNotNull(variations);

  if (this.variations == null) {
     throw new IllegalArgumentException();
  }
  this.engine = createEngine();
}

因此IDE找不到variations == null总是错误的。是否有任何特殊原因为什么不标记此前提条件@Nonull(即使其参数是使用定义@Nullable)。


问题答案:

@Nonnull很抱歉,我们没有在任何地方使用过。为什么?我们尝试添加更多的空检查注释,发现:

  • 添加所有其他注释非常冗长。
  • @Nullable这就是我们所需要的NullPointerTester。诚然,对于Guava开发人员而言,这比Guava用户更为重要。
  • @Nullable似乎遇到了大多数问题。我承认很难说在用户找到其他注释之前会捕获多少未检查的错误。

详细是最主要的。它变得很疯狂,尤其是对于子类型化和参数化类型。我们试图为注释选择一个最佳位置。也许有一天我们会更改它。但就目前而言,这就是事物按原样进行的原因。

(如果我们做了一些事情,我怀疑我们会尝试@Nonnull使用默认值,@CheckForNull而不是使用例外。但是我还没有仔细研究它以确保我理解正确。)



 类似资料:
  • 我对番石榴很陌生(说实话,我不是“很新”,我是这个主题的新手),所以我决定浏览一些文档,在阅读本文时感到非常惊讶: 我不明白这个方法的意义。这意味着,与其这样做,不如: (如果myObject为null,这可能会导致) 我应该用 如果为空,这将抛出一个,如果它不是空,则返回。 我很困惑,这可能是有史以来最愚蠢的问题,但是... 这有什么意义?这两条线和我能想到的任何情况下的结果是完全一样的。 我甚

  • 问题内容: 好的,我知道三引号字符串可以用作多行注释。例如, 和 但是从技术上讲,这些是字符串,对吗? 我已经在Google上搜索并阅读了Python样式指南,但无法找到关于为什么没有正式实现多行,/ * * /注释类型的技术答案。我使用三重引号没有问题,但是对于导致这个设计决定的原因我有点好奇。 问题答案: 我怀疑您会得到比“ Guido不需要多行注释”更好的答案。 Guido在推特上发布了以下

  • 问题内容: 以下两个代码段之间有什么区别? 它们之间有什么显着差异。在这些情况下进行空值检查的正确方法是什么。 问题答案: 两者是互补的:注解记录了必须为非空的事实,而调用则确保运行时该值不为空。 您应该将两者结合起来,如下所示: 有关的文档可以在这里找到: 可选的类型注释不能替代运行时验证 在类型注释之前,用于描述可为空性或范围之类的内容的主要位置位于javadoc中。通过类型注释,此通信以一种

  • 问题内容: 我发现注释在重写派生类中的某些超类方法时非常有帮助。基本上,编译器会尽早发现程序中的缺陷,这总是一件好事。但是,为什么Java中没有@Implements批注? 问题答案: 因为您也使用接口定义的方法。 (是的,您是“实现”而不是“覆盖” …但同时用于两者)

  • 我正在使用Intellij13.1.5和Java8 SDK,我已经设置了IntelliJ内置的nullness检查器,以便使用作为我选择的注释。 现在,当我写一个像这样的简单类时 我的下一个猜测是,多个库使用相同的注释名称,可能会出现名称冲突。但不幸的是,警告没有指定包的确切类名。如果是这种情况,一定有某种设置启用隐式注释。 如何在不删除注释的情况下删除此警告?

  • 问题内容: 我正在尝试做这样的事情: 不幸的是,即使在Java 9中也不存在。 为什么它被遗漏了? 建议的解决方法是什么? 问题答案: 为什么它被遗漏了? 该API提供了可重用的构建块。这里的相关积木是,,。通过这些,您可以实现所需的功能:将流内映射到对象,然后获得平面图。提供构建基块的排列是不切实际的,并且很难扩展。 建议的解决方法是什么? 如前所述,使用可用的构建基块(+ ):