2011-12-07 17 views
7

Checkstyleを使用して、システム依存のデフォルト(ロケール、ch​​arsetなど)を使用するコンストラクタやメソッドの使用を禁止できますか?私は、プログラマがシステム依存の値を明示する必要があるポリシーを施行することを好む。だから私は危険であると、以下の項目を検討してください。Checkstyleルールにより、一部のメソッドやコンストラクタの呼び出しを防ぐことができます

  • java.io.FielWriter
    • のすべてのコンストラクタシステム依存のエンコーディングを使用して
  • java.io.OutputStreamWriter
    • OutputStreamWriter(OutputStream os)コンストラクタをシステム依存のエンコーディングを使用して
  • システムのデフォルトロケールとデフォルトのタイムゾーンを使用して、システムのデフォルトロケールに
  • を使用してjava.lang.String.toLowerCase()方法
    • java.util.Calendar.getInstance()方法

    (リストが上になり、あなたが得ます画像)。

    Checkstyle 5.5を使用してこれを実行できますか?

  • +0

    良い質問です。個人的には、これはコンパイラ自身がデフォルトで警告すべきものだと思います。これらのメソッドを使用するバグは多くありません。 – Voo

    +1

    これらのメソッドに@SystemDependantアノテーションを追加する必要があります。 – gawi

    +0

    私は新しいDate()を避けるためにカスタムチェックを書いています。興味があるならこれを見てください:http://beansgocrazy.blogspot.com.au/2012/04/when-dates-go-wild.html – n0rm1e

    答えて

    1

    これはデフォルトでは実行できません。ただし、これらのメソッドをチェックする独自のチェッカーを実装できます。

    最初のオプションは、[Miscellaneous-> Regexp]を使用することです。これは明らかに正規表現で違反を見つけることができる場合にのみ可能です。 illegalPattern = trueを設定する必要があります。これは良いスタート地点になるはずです。

    2番目のオプションは、独自の小切手を作成することです。 Writing Checksを参照してください。

    チェッカーの作成には制限があります。最初の最も重要なのは、他のファイルを見ることができないことです。十字チェックはありません。サイトから:

    1. 式のタイプは判別できません。
    2. 他のファイルの内容は表示されません。 (後で使用するために処理されたファイルを保存することができますが)

    これは、コード検査のいくつかのIntelliJ IDEAのような高度なIDEで使用可能な 機能を実装することができないことを意味します。 の例では、冗長 タイプのキャストまたは未使用のパブリックメソッドを検出するCheckを実装することはできません。

    したがって、JavaがLocaleの代替方法を持つ1つのメソッドを呼び出していることを確認できませんでした。あなたは、あなたが呼ぶことができない方法のブラックリストを使うことができます。たとえば、新しいFileWriter()を呼び出すと、渡されたパラメータの数などがチェックされます。

    0

    私はアノテーションプロセッサがこのタスクに適していると思います。 Matthew Farwell's answerから "式の種類を判別することはできません。"

    FileWriterを拡張するFancyWriterクラスを含むサードパーティのjarを使用すると仮定します。あなたは違法にコードにx = new FancyWriter () ;を入れます。 CheckStyleは正規表現を使用しているため、FancyWriterがFileWriterであることを知るほどスマートではないため、CheckStyleはそれを見つけられません。私はあなたがFancyWriterが本当にFileWriterであり、違法であると分かる注釈プロセッサを書くことができると思います。

    誰かが、理論上、誰かがシステムの依存関係を解消する違法なクラスの拡張を書くことができます。たとえば、FileWriterにシステムエンコーディングを取得するメソッドがあるとします。 LegalWriterがFileWriterを継承してメソッドをオーバーライドする場合、不正なクラスを拡張したb/cだけでLegalWriterを拒否してはいけません。

    サードパーティ製のジャーを使用している場合、そのクラスはどのように合法ですか。彼らが違法なクラスを拡張していないからといって、彼らがそれを使わないというわけではありません。次に、クラスのいずれかを使用する場合、コードはシステムに依存します。

    0

    Matthewemoryと記載されているように、チェックスタイルの完璧な解決策はありません。

    • 一部のコンストラクタのみを禁止するのではなく、影響を受けるクラスのすべてのコンストラクタを禁止します。次に、禁止されたコンストラクタを隠す独自のサブクラスを作成します。例えば、チェックスタイルのパターン「FileWriter\(」とサブクラスSystemIndependentFileWriterを作成し、スーパークラスのコンストラクタの一部のみを作成します。
    • パターン「toLowerCase()」を作成し、誰も同じ名前のメソッドを作成しなかったことを願ってください。 Or use FindBugs to catch this one.
    • チェックスタイルパターン「Calendar.getInstance()」を作成します。私はそれに問題は見られません。

    うまくいけば、無視リストに置くことができる偽陽性がほんのわずかしか発生しないことを望みます。最終的に改行やその他の空白の空白をキャッチするには、それを微調整する必要があります。

    関連する問題