checkstyle警告“不允许声明变量,返回值或'ArrayList'类型的参数。”意思?

时间:2014-09-19 09:00:32

标签: java eclipse arraylist warnings checkstyle

我写了下面的课。

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;是不允许的。

我该如何解决这个问题,这个警告背后的理由是什么?

4 个答案:

答案 0 :(得分:7)

  

......这个警告背后的理由是什么?

鼓励编码接口而不是具体实现。通过将names声明为List<String>,您将限制使用List方法,而不是使用ArrayListList之上提供的任何特定内容。

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)

您可以查看this page

原因是CheckStyle试图警告你,在变量声明,返回值或参数中使用具体类不是一个好习惯。

您应该使用抽象的clases或接口。这将减少与混凝土路段的耦合。

答案 3 :(得分:0)

尝试private List<String> names = new ArrayList<String>();