一尘不染

在Java中使用初始化程序与构造方法

java

因此,最近我一直在提高自己的Java技能,并且发现了一些以前不了解的功能。静态和实例初始化程序是两种这样的技术。

我的问题是,何时将使用初始化程序而不将代码包含在构造函数中?我想到了几个明显的可能性:

  • 静态/实例初始值设定项可用于设置“最终”静态/实例变量的值,而构造函数不能

  • 静态初始值设定项可用于设置类中任何静态变量的值,该值应比在每个构造函数的开头使用“ if(someStaticVar == null)//做东西”代码块更有效。

这两种情况都假定设置这些变量所需的代码比简单地“ var = value”更为复杂,否则在声明变量时似乎没有任何理由使用初始化程序而不是简单地设置值。

然而,尽管这些并不是微不足道的收益(尤其是设置最终变量的能力),但似乎确实有少数情况下应该使用初始化器。

当然,在构造函数中可以完成很多事情,但是可以使用初始化程序,但是我真的不知道这样做的原因。即使一个类的所有构造函数都共享大量代码,使用私有的initialize()函数对我来说似乎比使用初始化程序更有意义,因为在编写新代码时,它不会使你锁定代码运行构造函数。

我想念什么吗?在其他情况下,应该使用初始化程序吗?还是在非常特定的情况下使用它真的只是一个相当有限的工具?


阅读 268

收藏
2020-03-17

共2个答案

一尘不染

静态初始化程序对于cletus很有用,我以相同的方式使用它们。如果你有一个静态变量要在加载类时进行初始化,则可以使用静态初始值设定项,尤其是因为它允许你执行复杂的初始化并且仍然具有静态变量be final。这是一个巨大的胜利。

我发现“ if(someStaticVar == null)//做东西”是混乱且容易出错的。如果它是静态初始化并声明的final,则避免了被初始化的可能性null。

但是,当你说:

静态/实例初始值设定项可用于设置“最终”静态/实例变量的值,而构造函数不能

我假设你同时在说:

  • 静态初始值设定项可用于设置“最终”静态变量的值,而构造函数不能
  • 实例初始化器可用于设置“最终”实例变量的值,而构造函数不能
    而你在第一点上是正确的,在第二点上是错误的。例如,你可以执行以下操作:
class MyClass {
    private final int counter;
    public MyClass(final int counter) {
        this.counter = counter;
    }
}

同样,当构造函数之间共享大量代码时,处理此问题的最佳方法之一是链接构造函数,并提供默认值。这很清楚地表明正在做什么:

class MyClass {
    private final int counter;
    public MyClass() {
        this(0);
    }
    public MyClass(final int counter) {
        this.counter = counter;
    }
}
2020-03-17
一尘不染

匿名内部类不能具有构造函数(因为它们是匿名的),因此它们非常适合实例初始化程序。

2020-03-17