【问题标题】:final optional member variable in Java classesJava 类中的 final 可选成员变量
【发布时间】:2013-11-25 09:58:43
【问题描述】:

我有一个场景,在某些情况下,在类级别声明的一些最终变量是可选的。

这意味着我有不同的构造函数。其中一些必须将成员变量保留为空值。

由于我已将变量声明为 final,因此我不得不在构造函数中初始化它们。所以我必须在构造函数中添加 var = null; 语句。

但是将变量显式分配给 null 被认为是一种不好的做法,并且 PMD 等工具将其报告为违规行为。 (PMD 中有争议的规则。但不想将其关闭,因为我不希望在我的代码的其他区域执行 null 赋值)

有任何其他建议或良好做法可以实现这一目标吗?

【问题讨论】:

  • 嗯....闻起来像继承问题。 :)
  • 一个简单的代码示例演示你的问题会更有用:)

标签: java inheritance constructor pmd


【解决方案1】:

您可以使用构造函数链接,将 null 传递给实例中未使用的值。 (如果我们正在讨论继承,您可以使用超级构造函数,或者在同一个类中使用不同的构造函数。) 毕竟我会重新考虑你的类的设计,例如将可选部分提取到不同的类。

【讨论】:

    【解决方案2】:

    实例变量被赋予默认值(如果是自定义对象则为空)。

    因此,除非您真的为最终变量分配了一些值,否则为什么还要为 null 分配而烦恼?

    正如用户在上面的评论中指出的那样,最终变量并不适合。那么可以做些什么来定义一个无参数的构造函数,并将所有最终值都设置为 null。

    现在在单个 arg 构造函数中,通过使用 this() 作为第一条语句来调用此默认构造函数..然后您可以根据传递的参数分配值。

    【讨论】:

    • 当变量被标记为 final 时不会。我们将不得不在构造函数中为最终变量显式地包含赋值语句。否则编译器会抱怨。