[英]Java ArrayList add() method in the instance variable section
在通常聲明/定義實例變量的Java類中,我想將ArrayList
作為實例變量之一,並以一些元素開始對其進行初始化。 一種實現方法是聲明ArrayList
並在構造函數中對其進行初始化。 但是,我想知道為什么在構造函數外部初始化值是非法的。 例如,
public class Test {
// some instance variables...
private ArrayList<String> list = new ArrayList<String>();
list.add("asdf");
// methods here...
}
所以我知道這是非法的。 但是為什么這是非法的呢?
您不能在類中自由執行語句。 它們應該在方法內部。 我建議您將此行添加到類的構造函數或類初始化塊中。
在類構造函數中:
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...
}
更多信息:
這是非法的,因為初始化字段正是構造函數存在的原因!
在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<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");
}
}
如果您使用番石榴( https://code.google.com/p/guava-libraries/ ),則可以使用以下糖碼:
private ArrayList<String> list = Lists.newArrayList("element1", "element2", ...)
另外,前面已經提到過,我建議不要將您的字段輸入為ArrayList,而是輸入List。 始終使用更抽象的類型,很好的經驗法則。
如果該代碼不在類的已定義函數中,則不會被調用。 如果允許這樣做,則在您創建了一個不希望的行為的類后,該類中的所有內容都會立即執行。
您無法執行建議的操作,而是可以使用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"));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.