2016-04-22 3 views
1

verbieten, nehme an, ich habe eine externe Bibliothek mit einer Klasse namens Foo. Ich kann Foo nicht ändern, um einen privaten Konstruktor zu haben, aber ich habe eine FooFactory-Klasse, die ich geschrieben habe.checkstyle - Initialisiere Objekt vom Typ

So habe ich FooFactory.getAFoo(), aber ich will checkstyle, um alle new Foo() im Rest meines Codes zu fangen, um die Verwendung der Fabrik zu erzwingen.

Ich habe dies:

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

aber dies scheint nicht zu einem new Foo() zu erkennen.

Ich könnte eine Regex verwenden, aber das ist viel sauberer.

Ich hatte ein ähnliches Problem mit der Verhinderung einer Klasse erweitern:

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

Keines dieser Check Modul scheint überhaupt etwas zu tun.

Was mache ich falsch?

Antwort

1

IllegalTokenText sucht nach illegalem Text auf dem Token selbst, nicht auf nachfolgenden IDENT-Tokens oder dergleichen. Deshalb scheint es in Ihrem Fall nichts zu tun.

In Ihrem Fall möchten Sie möglicherweise versuchen, die SevNTU Checkstyle Erweiterung zu verwenden, die eine Überprüfung bietet, die ForbidInstantiation genannt wird, die Ihr Problem möglicherweise beheben kann. Sie haben keine mir bekannte Dokumentation, also verbinde ich den Quellcode mit Javadoc. Achten Sie bei der Verwendung von SevNTU Checkstyle darauf, die richtigen Versionen des regulären Checkstyle und SevNTU Checkstyle zu verwenden, da nicht alle Kombinationen kompatibel sind (overview).

Wenn das nicht hilft, müssen Sie roll your own.