我见过开发人员以不同的方式初始化他们的类字段。其中三个很受欢迎! 有什么区别,其中任何一个更合适吗?
class Test {
ArrayList<String> myArr = new ArrayList<String>(); // First Method
}
class Test {
ArrayList<String> myArr;
public Test() {
myArr = new ArrayList<String>(); // Second Method
}
}
class Test {
ArrayList<String> myArr;
public Test() {
}
public void Init() {
myArr = new ArrayList<String>(); // Third Method
}
}
答案 0 :(得分:4)
1和2或多或少相等,也允许您在字段上使用final
修饰符。
(不同之处在于,在情况1中,字段在构造函数调用之前初始化,而在情况2中,字段在调用构造函数时初始化。)
3是一种懒惰的初始化模式。
答案 1 :(得分:1)
第一个和第二个之间没有太大差异:区别在于语法更多。
在第一种方法中,您将声明和定义放在一起,因此您不会忘记初始化变量。
如果您希望根据某些条件进行不同的初始化,则第二种和第三种方法可以提供更大的灵活性。
第三个更适用于必须具有无参数构造函数的框架,并将分别调用“真实”初始化方法(包含所有必需参数)。第三种方法还允许更容易地“重置”对象到其初始状态。
注意:如果您有final
字段,则只能使用第一种或第二种方法,因为一旦初始分配发生并且分配已完成,就无法重新分配在构造函数结束时发生
答案 2 :(得分:1)
1和2是等价的,但如果变量是静态的,则行为会有所不同,如下面的代码
public class Test {
static String s="2"; // 1
Test()
{
System.out.println(s);
s="3"; //2
}
public static void main(String[] args) throws IOException {
System.out.println("1="+s);
new Test();
System.out.println("1="+s);
}
在1加载时会发生初始化,但如果在构造函数(2)中初始化静态变量,则在构造对象时将赋值。
3)根据需要,您正在初始化变量。
class Test {
ArrayList<String> myArr;
public Test() {
}
public void Init() {
myArr = new ArrayList<String>(); // Third Method
}
}
答案 3 :(得分:0)
关于控制和可读性:
第一个和第二个是等价的。
第二个帮助您控制初始化的顺序。
第三个可以提供延迟(延迟初始化),就像你测试你的课程并且不想创建所有内容一样。