class 的变量初始化

variable initialization of a class

我对class的变量初始化有疑问。 当通常用变量声明 class 并初始化(即使它们是最终的)时,我通过构造函数进行初始化。

例如:

class Example {
    private int a, b;
   
    public Example () {
        a = 5;
        b = 10;
    }

    // Methods
}

但你也可以在声明后立即启动。

例如:

class Example {
    private int a = 5, b = 10;
   
    // Methods
}

初始化变量的最佳方法是什么?有什么区别?

第一种方式初始化的变量将在init<>方法为运行时获取它们的值。以第二种方式初始化的变量将在执行构造函数时获得它们的值。对于像这样的简单用例,没有有效的区别,但如果您有多个构造函数或 "interesting" 对象生命周期发生的事情,它可能很重要。没有永远更好的方法。

(您如何获得不同行为的一个示例是,如果超类的构造函数 - 必须在子类之前 运行 - 使用反射以某种方式基于实例字段变量进行操作。这不是一件很常见的事情需要发生,但它是我所说 "interesting"...)

的一个例子
class Foo {
   String username = "user";
   String password = null;
}

在功能上等同于

class Foo {
    String username, password;
    Foo() { 
        username = "user";
        passowrd = null; 
    }
}

但是考虑一下,稍后您需要添加另一个构造函数的情况:

public Foo(String password) {
    this.password = password;
}

现在,有人打电话给 new Foo("mypasswd")username 未初始化的风险。如果在声明成员变量时对其进行初始化,则无论 class 的实例是如何创建的,它们将始终被初始化(反序列化除外,那是一个单独的故事!)。如果您在默认构造函数中初始化它们,那么所有其他构造函数都需要显式调用它或自行初始化变量。

建议在声明所有变量时始终为所有变量赋予某种初始值,以减少意外和不可预测行为的可能性。