2011-12-11 15 views
29

私はこれらのような日食に警告の多くを得る:Checkstyleで保護された変数がデフォルトで許可されないのはなぜですか?

変数「myVariable変数」はprivateとし、アクセッサメソッドを持っている必要があります。

私はprotectedAllowedをeclipseで手動でtrueに設定しなかったので、私はそれらを取得すると思います。しかし、なぜデフォルトでfalseに設定されていますか?保護された属性を使うべきではありませんか?

答えて

26

理論上、保護属性(変数)はオブジェクト指向言語のアンチパターンです。サブクラスのみがスーパークラスのメンバー属性にアクセスする必要がある場合は、属性自体をプライベートとして定義し、保護されたアクセサメソッド(getterおよびsetter)を作成します。このアプローチは、「情報隠蔽」という概念を適用します。別の解決策があります:保護された不変(最終)メンバー属性を定義する。

さらに読書:

+2

「公式に」? –

+2

@Oli Charlesworth:「正式に」正式な用語ではないかもしれませんが、私が「理論的に」言うなら、あなたは同意しますか? – home

17

私は推測し、民間がアンチパターンであるすべてのものを作ります。多くの場合、クラスは束で使用され、全体として、別々のパッケージに配置されたカプセル化されたエンティティを表します。彼らはお互いから何かを隠す必要はありませんが、このルールは正当な理由で隠れてしまい、混乱を増やし、スタイルを効果的に悪化させます。一方、我々はしばしばクラスが公開されていることをよく見ています。私はこれがはるかに悪いと思うが、チェックスタイルはそれをチェックしない。

カプセル化は、クラスレベルだけでなく、パッケージ、システムなどにも存在します。そして、私はこれらのレベルがさらに重要だと思います。

4

パッケージアクセスを許可すると、パッケージ内のプログラミングが簡単になり、定型コードが削減されます。多くの場合、アクセスはパッケージ内からのみ必要です。プライベートアクセスでは、ほとんど役に立たないアクセサーメソッドをたくさん作成する必要があります。これは、クラスがパブリックアクセサーメソッドを介してパッケージ全体ではなく、内部データ/構造アプリケーション全体を公開する必要があるため、カプセル化と情報隠蔽を削減する効果があります。デフォルトのパッケージの可視性により、テストクラスも(テストディレクトリ/ツリー内の)同じパッケージに存在するため、テストがより簡単になります。