簡體   English   中英

實例變量部分中的Java ArrayList add()方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM