Java ArrayList add() 方法在实例变量部分

Java ArrayList add() method in the instance variable section

在通常 declare/define 实例变量的 Java class 中,我想将 ArrayList 作为实例变量之一并用一些初始化它开始的元素。一种方法是声明 ArrayList 并在构造函数中对其进行初始化。但是,我想知道为什么在构造函数之外初始化值是非法的。例如,

public class Test {
    // some instance variables...

    private ArrayList<String> list = new ArrayList<String>();
    list.add("asdf");

    // methods here...
}

所以我知道这是非法的。但为什么这是非法的呢?

如果该代码在 class 定义的函数之外,将不会被调用。如果允许这样做,那么 class 中的所有内容都会在您创建 class 后立即执行,这不是人们想要的行为。

您不能在 class 中自由执行语句。它们应该在一个方法中。我建议您将此行添加到 class 的构造函数或 class 初始化块中。

在class构造函数中:

public class Test {
    // some instance variables...

    private List<String> list = new ArrayList<>();

    public Test() {
        list.add("asdf");
    }
    // methods here...
}

在class初始化块中:

public class Test {
    // some instance variables...

    private List<String> list = new ArrayList<>();

    {
        list.add("asdf");
    }
    // methods here...
}

更多信息:

  • What's the difference between an instance initializer and a constructor?

这是非法的,因为初始化字段正是构造函数存在的原因!

在 Java 中,不可能在方法或构造函数(或 class-初始化程序)的任何地方 'outside' 有代码。字段初始值设定项中可以有简单的表达式,但不能有多个语句:

public class Test {
    // here, at class level, you can only declare fields, methods or constructors!
    // But you cannot have procedural code!!!

    // field without initializer (=> default initialization with null)
    private List<String> list1;

    // field with explicit initializer expression
    private List<String> list2 = new ArrayList<String>();

    public Test() {
        // initialize fields
        this.list1 = new ArrayList<>();

        this.list2.add("asdf");
    }
}

您不能按照您的建议进行操作,而是可以使用 java.utils.Arrays.asList(T) 初始化变量,如下所示:

public class Test{
    private List<String> foo = new ArrayLis<>(Arrays.asList("a", "b", "c"));
}

如果你想用一些元素初始化,你可以这样做:

private ArrayList<String> list = new ArrayList<>(java.util.Arrays.asList("asdf"));

如果您使用 Guava (https://code.google.com/p/guava-libraries/),您将获得此糖代码:

private ArrayList<String> list = Lists.newArrayList("element1", "element2", ...)

此外,之前已经提到过,我建议不要将您的字段键入为 ArrayList,而应键入为 List。始终使用更抽象的类型,良好的经验法则。