【问题标题】:What does the checkstyle warning "Declaring variables, return values or parameters of type 'ArrayList' is not allowed." mean?checkstyle 警告“不允许声明 'ArrayList' 类型的变量、返回值或参数”是什么意思。意思是?
【发布时间】:2014-09-19 09:00:31
【问题描述】:
我写了以下课程。
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给出了警告:
不允许声明“ArrayList”类型的变量、返回值或参数。
我该如何解决这个问题,这个警告背后的原因是什么?
【问题讨论】:
标签:
java
eclipse
arraylist
warnings
checkstyle
【解决方案1】:
...这个警告背后的原因是什么?
这是为了鼓励对界面而不是具体实现进行编码。通过将names 声明为List<String>,您将限制自己使用List 方法,而不是使用ArrayList 在List 之上提供的任何特定内容。
在一般中,对接口进行编码是一种很好的做法。像大多数规则一样,也有例外。
我该如何解决这个问题...
将names 声明为List<String>,而不是ArrayList<String>:
/** List of names. */
private List<String> names = new ArrayList<String>();
它仍然是ArrayList<String>,只是它会被声明为List<String>。
如果你有一个好的理由必须将names声明为ArrayList<String>,您可以使用suppression annotation(或suppression filter)告诉CheckStyle 您已经做出了有意的决定。注释可能是:
/** List of names. */
@SuppressWarnings("InterfaceIsType")
private ArrayList<String> names = new ArrayList<String>();
...但是请仔细检查该名称,我不知道 CheckStyle。我的名字来自here。
当然,如果您不喜欢该警告,只需将其全局关闭即可。
【解决方案2】:
您应该始终针对接口而不是实现进行编程。
即即使您决定将 ArrayList 用于特定任务,也要将变量声明为 List,dto。为返回值。这允许您用其他东西替换 ArrayList,而不会破坏您的代码。
示例:您从方法返回一个列表:
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>,您将无法进行该更改,或者您必须更改类的接口,从而破坏调用类的代码。
【解决方案3】:
你可以看看this page。
原因是 CheckStyle 试图警告你在变量声明、返回值或参数中使用具体类不是一个好习惯。
您应该改用抽象类或接口。这将减少与具体类的耦合。
【解决方案4】:
试试private List<String> names = new ArrayList<String>();