如何初始化一个类字段?

时间:2012-06-19 12:05:42

标签: java class

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

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 个答案:

答案 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)

关于控制和可读性:

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

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

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