web-dev-qa-db-ja.com

Checkstyleでは、保護された変数がデフォルトで許可されないのはなぜですか?

次のようなEclipseで多くの警告が表示されます。

変数 'myVariable'はプライベートで、アクセサメソッドを持っている必要があります。

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

35
Martin Thoma

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

さらに読む:

27
home

おそらく、すべてをプライベートにすることはアンチパターンです。多くの場合、クラスは束で使用され、全体として、個別のパッケージに配置されたカプセル化されたエンティティを表します。彼らは互いに何かを隠す必要はありませんが、このルールは正当な理由なしに非表示を強制し、混乱を増やし、スタイルを(私が理解しているように)悪化させます。一方、パッケージのeveryクラスがパブリックであることがよくあります。これはもっと悪いと思いますが、checkstyleはそれをチェックしません。

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

19
Rorick

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

7
John Hogan