在Java中初始化ArrayList字段的最佳实践

Jav*_*Dev 5 java initialization arraylist

在Java中初始化ArrayList字段的最佳实践是什么(避免测试空值)?

在声明时,像这样:

private List<String> myList = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

或者在吸气器中,像这样:

public List<String> getMyList() {
    if(myList == null) {
        myList = new ArrayList<String>();
    }
    return myList;
}
Run Code Online (Sandbox Code Playgroud)

或者,在构造函数中:

public Test(){
    myList = new ArrayList<String>();
}
Run Code Online (Sandbox Code Playgroud)

也许它是一样的,但我很想知道.

Gho*_*ica 8

第一个选项允许你做一个

private final List<String> myList = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

从而防止您以后意外地创建一个全新的列表; 从而帮助(很多,而不是所有)多线程问题.除此之外,现在编译器可以帮助您确保您的字段只初始化一次.

除此之外,第二个选项可以被视为"延迟初始化".从这个意义上说:它可以被视为"优化选择"!从那里:许多人主张避免过早优化!

你知道,当你不能依赖已经创建的列表时会造成很多麻烦.因此,即使从这个角度来看,你还有另一个理由来选择选项1!

编辑,关于编译器选项:从语义上看,选项1和3是(或多或少)"相等"[提示:如果你发现如果你选择option1或option3那会对你的代码产生影响......那就是很好地表明你在你的代码中做了一些非常错误的事情).

尽管如此,有一点可以产生影响 - 如果你有一个"依赖注入"构造函数,如:

public YourClass() { this(new ArrayList<String>); }
YourClass(List<String> incomingList) { myList = incomingList; }
Run Code Online (Sandbox Code Playgroud)

这个解决方案对于你需要"控制"的那些对象是有意义的; 在以下意义上:您需要将模拟传递给您的类以启用单元测试.

长话短说:

  • 如果可能,首选option1:使用final
  • 如果需要依赖注入,请使用option3
  • 除非你有充分的理由去做,否则请避免使用option2