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 的实例是如何创建的,它们将始终被初始化(反序列化除外,那是一个单独的故事!)。如果您在默认构造函数中初始化它们,那么所有其他构造函数都需要显式调用它或自行初始化变量。
建议在声明所有变量时始终为所有变量赋予某种初始值,以减少意外和不可预测行为的可能性。
我对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 的实例是如何创建的,它们将始终被初始化(反序列化除外,那是一个单独的故事!)。如果您在默认构造函数中初始化它们,那么所有其他构造函数都需要显式调用它或自行初始化变量。
建议在声明所有变量时始终为所有变量赋予某种初始值,以减少意外和不可预测行为的可能性。