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

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

 public class Test { // some instance variables... private ArrayList list = new ArrayList(); list.add("asdf"); // methods here... } 

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

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

在类构造函数中:

 public class Test { // some instance variables... private List list = new ArrayList<>(); public Test() { list.add("asdf"); } // methods here... } 

在类初始化块中:

 public class Test { // some instance variables... private List list = new ArrayList<>(); { list.add("asdf"); } // methods here... } 

更多信息:

  • 实例初始化器和构造函数之间有什么区别?

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

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

 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 list1; // field with explicit initializer expression private List list2 = new ArrayList(); public Test() { // initialize fields this.list1 = new ArrayList<>(); this.list2.add("asdf"); } } 

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

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

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

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

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

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

你不能做你提出的建议,而是可以使用java.utils.Arrays.asList(T)来初始化变量,如下所示:

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