Класс '' должен быть объявлен как 'абстрактный'. Чекстайл

У меня есть это предупреждение на большинстве моих классов, и я не уверен, почему это так. Это происходит как с общедоступными нормальными классами, так и с конечными классами, которые имеют частные конструкторы, а некоторые вообще не имеют конструктора. Я пытался изменить методы частного класса на защищенные, не помогает.
Есть предложения, как это отключить?

Вот пример класса

public final class PlanBenefitManagerAssembler {

    private static final Logger LOGGER = Logger.getLogger(PlanBenefitManagerAssembler.class);

    /**
     * No Instance of the this class is allowed.
     */
    private PlanBenefitManagerAssembler() {

    }

    public static List<BenefitDecisionDetailsBean> assembleBenefitDecisionDetailsBean(
            List<BenefitDetails> benefitDecisionDetailsList, int relationalSequenceNumber) {

        LOGGER.debug("Enter assembleBenefitDecisionDetailsBean");
        List<BenefitDecisionDetailsBean> benefitDecisionDetailsBeanList = new ArrayList<BenefitDecisionDetailsBean>();

        for (BenefitDetails benefitDecisionDetails : benefitDecisionDetailsList) {
            BenefitDecisionDetailsBean benefitDecisionDetailsBean = new BenefitDecisionDetailsBean();
            benefitDecisionDetailsBean.setBenefitTypeCode(benefitDecisionDetails.getBenefitTypeCode());
            benefitDecisionDetailsBean.setRelationSequenceNumber(relationalSequenceNumber);
            benefitDecisionDetailsBean.setBenefitStatusDescription(
                    benefitDecisionDetails.getBenefitStatusDescription());
            benefitDecisionDetailsBean.setBenefitStatusCode(benefitDecisionDetails.getBenefitStatusCode());
            benefitDecisionDetailsBean.setBenefitUnderwritingStatusCode(
                    benefitDecisionDetails.getBenefitUnderwritingStatusCode());
            benefitDecisionDetailsBean.setBenefitUnderwritingStatusDescription(
                    benefitDecisionDetails.getBenefitUnderwritingStatusDescription());
            benefitDecisionDetailsBean.setBenefitChangeReasonCode(
                    String.valueOf(benefitDecisionDetails.getBenefitChangeReasonCode()));
            benefitDecisionDetailsBean.setBenefitChangeReasonDescription(
                    benefitDecisionDetails.getBenefitChangeReasonDescription());
            benefitDecisionDetailsBean.setComponentNumber(benefitDecisionDetails.getBenefitNumber());

            benefitDecisionDetailsBean.setBenefitVisible(benefitDecisionDetails.isExplicitBenefitDecisionRequired());

            benefitDecisionDetailsBean.setModelChanged(false);

            // * Set BenefitLoading and BenefitExclusion
            List<ExclusionDetailsBean> exclusionDetailsBeanList =
                    PlanBenefitManagerAssembler.assembleExclusionDetailsList(benefitDecisionDetails
                            .getBenefitExclusionsDetailsList().getBenefitExclusionsDetailsList());

            List<LoadingDetailsBean> loadingDetailsBeanList =
                    PlanBenefitManagerAssembler.assembleLoadingDetailsList(benefitDecisionDetails
                            .getBenefitLoadingsDetailsList().getBenefitLoadingsDetailsList());

            benefitDecisionDetailsBean.setExclusionDetailsBeanList(exclusionDetailsBeanList);
            benefitDecisionDetailsBean.setLoadingDetailsBeanList(loadingDetailsBeanList);

            benefitDecisionDetailsBeanList.add(benefitDecisionDetailsBean);         
        }

        LOGGER.debug("Exit assembleBenefitDecisionDetailsBean");

        return benefitDecisionDetailsBeanList;
    }
}

person sonx    schedule 18.01.2012    source источник
comment
Добавьте код, вызывающий это предупреждение. Кстати, какую IDE вы используете?   -  person MockerTim    schedule 18.01.2012
comment
Найдите предупреждение в документации Checkstyle, где должно быть объяснено, почему вы его получили.   -  person Jesper    schedule 18.01.2012
comment
не уверен, но я думаю, что checstyle ищет, можно ли создать экземпляр класса с помощью общедоступного конструктора, и если нет, то он говорит себе: «Ну, это должен быть абстрактный класс, но он не был объявлен абстрактным, поэтому давайте предупредим пользователя»   -  person T I    schedule 18.01.2012
comment
@MockerTim: почему IDE может быть актуальна? Java-код — это Java-код, а Checkstyle не зависит от IDE.   -  person JB Nizet    schedule 18.01.2012
comment
@JBNizet Я не знаком с Checkstyle, но если он использует плагины для интеграции с IDE, это зависит от IDE. В любом случае, информация об IDE не усложняет вопрос. :)   -  person MockerTim    schedule 18.01.2012
comment
@MockerTim: Итак, если я использую плагин для создания своих методов hashCode и equals, вам нужно знать, какая IDE используется, если у меня есть ошибка в моем методе equals? Checkstyle генерирует предупреждения о коде Java, и что бы вы ни использовали для просмотра этих предупреждений, предупреждения означают одно и то же. IDE совершенно не при чем.   -  person JB Nizet    schedule 18.01.2012
comment
@MockerTim, у меня есть и IBM RSA 8, и Eclipse Indigo, использующие один и тот же стиль проверки 5.0.3 ... Странно, что я получаю это предупреждение только для eclipse, а не для RSA. Так что ваши подозрения относительно IDE могут оказаться правдой.   -  person sonx    schedule 18.01.2012
comment
@JBNizet Конечно, это зависит от конкретного случая. Не о чем спорить.   -  person MockerTim    schedule 18.01.2012
comment
@sonx Итак, как насчет кода?   -  person MockerTim    schedule 18.01.2012
comment
@sonx: вы только что включили другой набор правил в обеих IDE. Как называется правило, вызывающее это предупреждение? Вы смотрели его описание в документации Checkstyle?   -  person JB Nizet    schedule 18.01.2012
comment
Пожалуйста, добавьте скриншот предупреждения к вашему сообщению. Как в в этом примере.   -  person MockerTim    schedule 18.01.2012
comment
Возможно, самый простой способ решить вашу проблему — установить последнюю версию плагина Checkstyle для Eclipse.   -  person MockerTim    schedule 18.01.2012
comment
@sonx: вы уверены, что не видите предупреждение, созданное для более старой версии этого класса?   -  person JB Nizet    schedule 18.01.2012
comment
Кстати, то, что вы делаете в классе вручную, вы также можете позволить Dozer сделать это за вас: dozer.sourceforge .net Вам не придется много настраивать.   -  person Peter Wippermann    schedule 06.06.2012


Ответы (3)


Когда Checkstyle выдает предупреждение, текст предупреждения должен включать короткое имя правила, которое позволит вам найти точное правило, которое срабатывает. «Дизайнфорекстенсион», например.

Учитывая имя правила, вы можете найти более подробную информацию о том, что оно означает, в документации по Checkstyle: http://checkstyle.sourceforge.net/availablechecks.html

Опубликуйте полную информацию о срабатывающем правиле, и кто-то может помочь.

person Tim Gage    schedule 18.01.2012
comment
Предупреждение не содержит никакой информации, типа или имени предупреждения. Я попытался навести указатель мыши на предупреждение. Только сообщение отображается - person sonx; 18.01.2012
comment
@sonx Я установил плагин Checkstyle для NetBeans. У меня также нет описания правил. - person MockerTim; 18.01.2012
comment
Небольшой поиск приводит к [github. com/eclipse/jubula.core/tree/, что предполагает: а) это правило AbstractClassName, которое вы запускаете, и б) что вы могли столкнуться с ошибкой в ​​Checkstyle. - person Tim Gage; 18.01.2012
comment
Есть ли у вас файл checkstyle.xml при использовании в NetBeans? Я знаком только с плагином Eclipse. - person Tim Gage; 18.01.2012
comment
@ Тим, я тоже использую eclipse, да, у меня есть xml. Я проверил код на svn и спросил, испытывает ли мой коллега то же самое на своем WS. Может быть ошибка - person sonx; 19.01.2012

Предупреждения всегда можно отключить, но они здесь не просто так :)

  • Вы собираетесь сделать их абстрактными классами? Если да, объявите их таким образом.
  • Вам нужно будет создавать их экземпляры в какой-то момент? Если это так, добавьте общедоступный конструктор.

Я уверен, что это решит вашу проблему.

person Silver Quettier    schedule 18.01.2012
comment
Привет, Сильвер, я не собираюсь использовать их как абстрактные классы. Я пробовал публичный конструктор, без изменений. - person sonx; 18.01.2012
comment
Я удивлен, что он предлагает сделать его абстрактным. Судя по вашему коду, я бы сделал его статическим. Насколько я понимаю, это служебный класс. Экземпляр не нужен, только статические методы? Статический класс. Но это не ответ на вашу актуальную проблему. Я проверю документацию Checkstyle, но никогда не сталкивался с вашей проблемой. - person Silver Quettier; 18.01.2012
comment
Невнутренний класс не может быть статическим. - person JB Nizet; 18.01.2012
comment
Я смешиваю свои языки. Виноват. Проголосуйте за то, что указали мне на очевидное, добрый сэр. - person Silver Quettier; 18.01.2012

На sourceforge говорится, что правило AbstractClassName использует следующее регулярное выражение:

^Abstract.*$|^.*Factory$

Это приводит к тому, что классы с именем, начинающимся с «Abstract» или заканчивающимся на «Factory», помечаются. Я понимаю часть «Abstract..», но почему все классы «..Factory» должны быть абстрактными? Иногда я создаю фабрики, которые используют зависимости для выполнения своей работы, поэтому мне нужен экземпляр для внедрения.

Однако это не объясняет вашего случая. Я попробовал ваш примерный класс и не получил предупреждения Checkstyle (я использую подключаемый модуль Eclipse Checkstyle версии 5.3.0.201012121300).

Вы уверены, что получаете предупреждение AbstractClassName для этого класса? Какую версию Checkstyle вы используете?

person Adriaan Koster    schedule 15.02.2012
comment
Может быть, стоит добавить сюда скриншот, но не знаю, как. любые рекомендации будут полезны - person sonx; 23.02.2012
comment
В Eclipse перейдите в раздел «Справка» -> «О Eclipse SDK» -> «Сведения об установке» -> «Плагины» и найдите версию плагина Checkstyle. Для предупреждения просто перепроверьте, что ваш класс действительно приводит к предупреждению AbstractClassName, а не к какому-либо другому предупреждению. - person Adriaan Koster; 23.02.2012