0

我见过开发人员以不同的方式初始化他们的类字段。其中三个非常受欢迎!有什么区别,它们中的任何一个更合适吗?

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
    }
}
4

4 回答 4

4

1 和 2 或多或少是等效的,并且还允许您final在字段上使用修饰符。

(不同的是,在情况 1 中,该字段在构造函数调用之前被初始化,而在情况 2 中,该字段在调用构造函数时被初始化。)

3 是惰性初始化模式。

于 2012-06-19T12:08:30.680 回答
1

第一个和第二个之间没有太大区别:区别在于语法上。

在第一种方法中,您将声明和定义放在一起,这样您就不会忘记初始化变量。

如果您想根据某些条件进行不同的初始化,则第二种和第三种方法可以提供更大的灵活性。

第三个是更多的框架,你必须有一个无参数的构造函数,并将分别调用“真正的”初始化方法(带有所有必要的参数)。第三种方法还允许更容易地将对象“重置”到其初始状态。

注意:如果您有一个final字段,则只能使用第一种或第二种方法,因为一旦发生初始分配,就无法重新分配它,并且该分配必须在构造函数结束时发生

于 2012-06-19T12:09:31.773 回答
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); 
 }

In 1 初始化在类加载时发生,但如果您在构造函数 (2) 中初始化静态变量,则将在构造对象时分配值。

3)根据需要,您正在初始化变量。

class Test {
ArrayList<String> myArr;
public Test() {
}
public void Init() {
    myArr = new ArrayList<String>(); // Third Method
}
}
于 2012-06-19T12:29:44.467 回答
0

这是关于控制和可读性:

第一个和第二个是等价的。

第二个帮助您控制初始化的顺序。

第三个可以提供延迟(惰性初始化),就像您测试您的课程并且不想创建所有内容一样。

于 2012-06-19T12:09:45.673 回答