2014-09-19 1 views
1

Я написал следующий класс.Что предупреждает checkstyle «Объявление переменных, возвращаемых значений или параметров типа« ArrayList »не допускается». имею в виду?

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» не допускается.

Как я могу решить проблему, и в чем причина этого предупреждения?

ответ

6

... что такое обоснование этого предупреждения?

Это поощрение кодирования к интерфейсу, а не к конкретной реализации. Объявив 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>, вы можете сказать Checkstyle, что вы сделали намеренное решение там с помощью suppression annotation (или suppression filter). Аннотации могут быть:

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

... но дважды проверьте это имя, я не знаю CheckStyle. Я получил имя от here.

Или, конечно, если вам не нравится это предупреждение, просто отключите его по всему миру.

0

Попробуйте private List<String> names = new ArrayList<String>();

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>, вы бы не смогли внести это изменение или вам пришлось бы изменить интерфейс вашего класса, нарушив код вызывающих классов.

2

Вы можете посмотреть this page.

Причина в том, что CheckStyle пытается предупредить вас о том, что не рекомендуется использовать конкретные классы в объявлениях переменных, возвращаемых значениях или параметрах.

Вместо этого вы должны использовать абстрактные классы или интерфейсы. Это уменьшит сцепление с этими бетонными кладами.