实例初始化程序是否被视为不良样式

Mic*_*rry 5 java

我个人非常喜欢实例初始化器 - 我使用它们来为诸如集合之类的东西分配默认值,所以在编写构造函数时,我不必记住每次都为它们分配相同的默认值.对我来说这似乎很优雅 - 避免恼人的NPE弹出并避免重复代码.私有方法似乎不太好,因为a)它不能为最终字段赋值,b)它可以在代码中的其他地方运行,c)该方法仍然需要在每个构造函数的开头显式调用.

然而,与我所说过的其他人的另一面是,他们令人困惑,有些人阅读代码可能不了解他们做什么或何时被调用,因此他们可能会导致比他们解决的问题更多的问题.

是否应该鼓励或避免使用这些初始化器?或者它是"每个人都有自己的"案例?

mer*_*ike 4

例如,这取决于代码读者预期拥有的 Java 知识水平,以及替代方案是否实用。

替代方案是:

  • 内联到每个构造函数中。如果有多个构造函数,则违反了 DRY。
  • 将所有构造函数委托给同一个构造函数,并将代码放在该构造函数中。如果构造函数很重要,并且采用不同的参数,则可能需要编写一个新的构造函数来接收其参数中所有字段的值。如果有很多字段,这可能会变得相当冗长(并且难以阅读,因为哪个值分配给哪个字段并不明显)
  • 让所有构造函数调用 init 方法。无法以这种方式分配最终字段。也许应该防止该方法被重写。可能想防止它被多次调用。

由于初始化器并不常见,因此只有当使用它们有明显的优势时,您才应该更喜欢它们。我最近使用的一个是:

private final Collator collator = Collator.getInstance();
{
    collator.setStrength(Collator.SECONDARY);
}
Run Code Online (Sandbox Code Playgroud)

在一个具有多个构造函数的类中,这些构造函数具有相当不同的参数列表和六个其他字段。