2016-04-22 3 views
1

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

Так что у меня есть FooFactory.getAFoo(), но я хочу, чтобы контрольный стиль поймал любой new Foo() в остальной части моего кода, чтобы заставить его использовать фабрику.

У меня есть это:

<module name="IllegalTokenText"> 
    <property name="tokens" value="LITERAL_NEW"/> 
    <property name="format" value="Foo"/> 
</module> 

, но это не похоже, чтобы обнаружить new Foo().

Я могу использовать регулярное выражение, но это намного чище.

У меня была аналогичная проблема с предотвращением простирающейся класса:

<module name="IllegalTokenText"> 
    <property name="tokens" value="EXTENDS_CLAUSE"/> 
    <property name="format" value="AndroidTestCase"/> 
</module> 

Ни один из этих Checkstyle модуля, кажется, делать что-либо вообще.

Что я делаю неправильно?

ответ

1

IllegalTokenText проверяет наличие незаконного текста на самом токене, а не на последующих жетонах IDENT или некоторых таких. Вот почему, похоже, в вашем случае ничего не делает.

В вашем случае вы можете попробовать использовать расширение SevNTU Checkstyle, которое предлагает проверку под названием ForbidInstantiation, которая может решить вашу проблему. У них нет документации, о которой я знаю, поэтому я связываю исходный код с Javadoc. Когда вы используете SevNTU Checkstyle, обязательно используйте правильные версии регулярных Checkstyle и SevNTU Checkstyle, потому что не все комбинации совместимы (overview).

Если это не поможет, вам понадобится roll your own.

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