【问题标题】: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&lt;String&gt;,您将限制自己使用List 方法,而不是使用ArrayListList 之上提供的任何特定内容。

    一般中,对接口进行编码是一种很好的做法。像大多数规则一样,也有例外。

    我该如何解决这个问题...

    names 声明为List&lt;String&gt;,而不是ArrayList&lt;String&gt;

    /** List of names. */
    private List<String> names = new ArrayList<String>();
    

    它仍然是ArrayList&lt;String&gt;,只是它会被声明为List&lt;String&gt;

    如果你有一个好的理由必须将names声明ArrayList&lt;String&gt;,您可以使用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&lt;String&gt;。如果您的返回值已声明为 ArrayList&lt;String&gt;,您将无法进行该更改,或者您必须更改类的接口,从而破坏调用类的代码。

      【讨论】:

        【解决方案3】:

        你可以看看this page

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

        您应该改用抽象类或接口。这将减少与具体类的耦合。

        【讨论】:

          【解决方案4】:

          试试private List&lt;String&gt; names = new ArrayList&lt;String&gt;();

          【讨论】:

            猜你喜欢
            • 2014-08-27
            • 2016-09-15
            • 1970-01-01
            • 2014-08-20
            • 1970-01-01
            • 2021-12-16
            • 2020-07-03
            • 1970-01-01
            • 2013-08-18
            相关资源
            最近更新 更多