【问题标题】:Make nulls opt-in only使空值仅选择加入
【发布时间】:2013-09-01 10:36:54
【问题描述】:

让我们假装我讨厌 null。让我们假设像@Nullable 那样选择退出对我来说还远远不够。假设我希望它选择加入;如果一个对象没有用@Nullable 显式注释,则不允许使用空值。

例子:

MyClass derp = null;           // Compiler error
@Nullable MyClass derp = null; // Fine
@Nullable Integer x = 4;       // Fine
@Nullable Integer x = null;    // Fine
Integer x = 4;                 // Fine
Integer x = null;              // Compiler error

另一个例子:

public static void myFunction(@Nullable Integer x) {
    Integer y = x;   // Compiler error, because we know x might
                     // be null, and that's not allowed. In other
                     // words: Integer != @Nullable Integer
}

我该怎么做呢?我会写一些javac插件吗?也许是预编译器通行证?也许有一个框架可以做到这一点?或者我可以修改javac的源代码?

谢谢!

【问题讨论】:

  • 您打算如何处理数组?在您考虑实施之前,我会尝试考虑您需要的所有语言更改。
  • 嗯...好点。也许我会让它调用默认构造函数,或者只是取缔 MyClass[] 之类的东西以支持 Nullable[]。我并不是说我们应该按照我的问题建议去做,但我想知道如果我们真的决定这样做会有多难。
  • 嗯,难度级别将取决于语言改变了多少,不是吗?至少在很大程度上。
  • 也许吧。这个问题仅限于静态分析领域,所以它应该不是非常困难......人们以前写过这样的东西,对吧?
  • 有些语言不允许空值,是的。但这很棘手,并且在不先决定要做什么的情况下尝试弄清楚如何做对我来说似乎是个坏主意。精确的细节很容易改变特定方法的可行性。

标签: java null nullable static-analysis static-typing


【解决方案1】:

在标有@NonNullByDefault 的代码区域内,您基本上可以得到问题所要求的内容:该默认值的任何异常都需要显式声明。可以为每个类/接口或每个包声明默认值。

注意 1:您需要空注释的 Java-8 变体 (null type annotations),因此它们会影响所有位置的类型引用。

注意 2:有关详细信息,请参阅Java doc,其中完全适用默认值(顺便说一句,可以微调)。由于@Jon Skeet 的评论中提到的困难,ARRAY_CONTENTS 被有意省略。

【讨论】:

    猜你喜欢
    • 2012-05-04
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 2017-10-01
    • 2013-08-11
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多