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

时间:2015-04-16 17:00:25

标签: java arraylist instance-variables

在通常声明/定义实例变量的Java类中,我希望将ArrayList作为实例变量之一并使用一些元素初始化它。执行此操作的一种方法是声明ArrayList并在构造函数中初始化它。但是,我想知道为什么在构造函数之外初始化值是非法的。例如,

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

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

    // methods here...
}

所以我觉得这是非法的。但为什么这是非法的呢?

6 个答案:

答案 0 :(得分:5)

您不能在课堂上自由执行语句。它们应该在一个方法中。我建议你在类的构造函数或类初始化块中添加这一行。

在类构造函数中:

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

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

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

在类初始化块中:

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

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

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

更多信息:

答案 1 :(得分:1)

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

在Java中,不可能在任何地方使用代码&#39;方法或构造函数(或类初始化程序)。可以在字段初始值设定项中使用简单表达式,但不能使用多个语句:

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");
    }
}

答案 2 :(得分:1)

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

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

另外,之前已经提到过,我建议不要将字段键入为ArrayList,而是键入List。总是使用更抽象的类型,良好的拇指规则。

答案 3 :(得分:0)

如果该代码超出了类的已定义函数,则不会调用该代码。如果允许这样做,一旦你创建了一个不是你想要的行为的类,类中的所有内容都会被执行。

答案 4 :(得分:0)

您无法执行您提出的建议,而是可以使用java.utils.Arrays.asList(T)初始化变量,如下所示:

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

答案 5 :(得分:0)

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

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