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。始终使用更抽象的类型,良好的经验法则。
在通常 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。始终使用更抽象的类型,良好的经验法则。