我写了下面的课。
package com.stackoverflow.examples;
import java.util.ArrayList;
/** RandomX. */
public final class Names {
/** List of names. */
private ArrayList<String> names = new ArrayList<String>();
/** Constructor. */
public Names() {
this.names.add("Test");
}
}
在声明names
Checkstyle的行中发出警告:
声明变量,返回值或类型&#39; ArrayList&#39;是不允许的。
我该如何解决这个问题,这个警告背后的理由是什么?
答案 0 :(得分:7)
......这个警告背后的理由是什么?
鼓励编码接口而不是具体实现。通过将names
声明为List<String>
,您将限制使用List
方法,而不是使用ArrayList
在List
之上提供的任何特定内容。
在 general 中,对接口进行编码是一种很好的做法。像大多数规则一样,也有例外。
我该如何解决问题...
将names
声明为List<String>
,而不是ArrayList<String>
:
/** List of names. */
private List<String> names = new ArrayList<String>();
它仍然 ArrayList<String>
,它只是被声明为List<String>
。
如果 您有一个良好的原因,names
必须宣布为{{ 1}},您可以告诉CheckStyle您使用suppression annotation(或suppression filter)做出了有意的决定。注释可能是:
ArrayList<String>
...但仔细检查这个名字,我不知道CheckStyle。我的名字来自here。
当然,如果您不喜欢这种警告,请将其全局关闭。
答案 1 :(得分:3)
您应该始终针对接口进行编程,而不是实现。
即。即使您决定将ArrayList用于特定任务,也请将该变量声明为List,dto。为了返回值。这允许您用其他东西替换ArrayList,而不会破坏您的代码。
示例:从方法返回List:
public List<String> getNames() {
List<String> = new ArrayList<String>();
...
return result;
}
稍后您决定需要保护名称列表以防止调用者进行更改。您可以将实施更改为:
public List<String> getNames() {
List<String> = new ArrayList<String>();
...
return Collections.unmodifiableList(result);
}
对于来电者没有任何变化,他仍然得到List<String>
。如果您的返回值已被声明为ArrayList<String>
,那么您将无法进行更改,或者您必须更改类的接口,从而破坏调用类的代码。
答案 2 :(得分:3)
答案 3 :(得分:0)
尝试private List<String> names = new ArrayList<String>();