2013-09-17 1 views
2

Я работаю с кодовой Java, которые имеют строгие Checkstyle проверок, и он не любит следующее непреложное значение объекта:Как разрешить неизменяемые классы, когда включен модуль проверки подлинности VisibilityModifier?

public class Foo { 
    public final int bar; 
    public final String baz; 

    public Foo(int bar, String baz) { 
     this.bar = bar; 
     this.baz = baz; 
    } 
} 

Это происходит потому, что VisibilityModifier модуля переменных сил экземпляра быть private и иметь добытчик.

  1. Есть ли способ сделать Checkstyle сделать исключение для переменных экземпляра, которые public final?

  2. Если да, существует ли способ сделать это исключение применимым только к классам испытаний?

+1

Имеет смысл, что члены 'final' могут быть общедоступными. Если бы я был вами, я бы попытался связаться с разработчиками Checkstyle и спросить их об этом, возможно, они изменят его в следующей версии или, по крайней мере, добавят свойство. – Dukeling

+0

Не то, о чем вы просите, но вы можете добавить '// CHECKSTYLE_OFF: Видимость над каждым классом, чтобы получить Checkstyle, чтобы перестать жаловаться. Я не знаю настройки, которая условно применяет правило. – Grundlefleck

+0

Я бы вообще утверждал, что вы этого не хотите. Даже когда поля являются окончательными, вы по-прежнему выставляете внутреннюю структуру вашего объекта, что навсегда ограничит ваши будущие варианты рефакторинга. Но это другое обсуждение. :-) –

ответ

1

Я не хочу сказать вам это, и я знаю, что это не может быть ответом вы надеялись, но:

Это действительно не представляется возможным из коробки, потому что поведение зашиты в проверка. Выдержка из Checkstyle source code:

if (!("private".equals(variableScope) 
    || inInterfaceOrAnnotationBlock // implicitly static and final 
    || (mods.contains("static") && mods.contains("final")) 
    || ("package".equals(variableScope) && isPackageAllowed()) 
    || ("protected".equals(variableScope) && isProtectedAllowed()) 
    || ("public".equals(variableScope) 
     && getPublicMemberRegexp().matcher(varName).find()))) 
{ 
    log(varNameAST.getLineNo(), varNameAST.getColumnNo(), 
     "variable.notPrivate", varName); 
} 

Вы должны write your own check, возможно, в качестве подкласса VisibilityModifierCheck который переопределяет метод visitToken() для того, чтобы обеспечить ваше исключение.

С другой стороны, если ваш класс Foo является внутренним классом, то вы также можете просто объявить поля частными и по-прежнему обращаться к ним из внешнего класса. Вид специального случая, но часто тот, где геттеры и сеттеры особенно раздражают.

 Смежные вопросы

  • Нет связанных вопросов^_^