在通常声明/定义实例变量的Java类中,我希望将ArrayList
作为实例变量之一并使用一些元素初始化它。执行此操作的一种方法是声明ArrayList
并在构造函数中初始化它。但是,我想知道为什么在构造函数之外初始化值是非法的。例如,
public class Test {
// some instance variables...
private ArrayList<String> list = new ArrayList<String>();
list.add("asdf");
// methods here...
}
所以我觉得这是非法的。但为什么这是非法的呢?
答案 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"));