3

有効な Java の項目 17 で、Josh Bloch は、静的メンバーをインターフェイスに配置する (およびそのインターフェイスを実装する) ことは、定数インターフェイスのアンチパターンとして知られる悪い習慣であると主張しています。

定数インターフェイス パターンは、インターフェイスの不適切な使用です。クラスが内部的にいくつかの定数を使用することは、実装の詳細です。定数インターフェイスを実装すると、この実装の詳細がクラスのエクスポートされた API に漏れます。クラスが定数インターフェースを実装することは、クラスのユーザーにとって重要ではありません。実際、それは彼らを混乱させることさえあります。さらに悪いことに、これはコミットメントを表しています。将来のリリースで定数を使用する必要がなくなるようにクラスが変更された場合でも、バイナリ互換性を確保するためにインターフェイスを実装する必要があります。非最終クラスが定数インターフェイスを実装する場合、そのすべてのサブクラスの名前空間は、インターフェイスの定数によって汚染されます。

など、Java プラットフォーム ライブラリにはいくつかの定数インターフェイスがあります java.io.ObjectStreamConstants。これらのインターフェイスは異常とみなされるべきであり、エミュレートされるべきではありません。

私はこの背後にある理由を理解し、完全に同意すると確信しています。

私の質問は次のとおりです: 関連する定数をグループ化することです (注: これらは列挙型には適していません。関連する定数 pi と e の数学の例を検討してください) 対インスタンス化不可能なクラスでは、値にのみアクセスすることをお勧めします。静的参照と静的インポートを介して、デフォルトのアクセス修飾子を使用して API からインターフェイスを非表示にし、実際にインターフェイスを実装することはありませんか?

なぜですか、そうでないのですか?プライベートコンストラクターを使用して定数グループ化タイプがインスタンス化されないようにする以外に、それらをクラスにグループ化する利点はありますか?

4

1 に答える 1

2

別の言い方をしましょう。定数にインターフェイスを使用する利点はありません。ご存じのとおり、インターフェイスはコントラクトを定義するためのものであり、定数のためのものではありません。interfaceたとえば、キーワードをキーワードに変更してフィールドをclass使用するという問題はありません。public static final定数を保持するためにインターフェイスを使用することは、決して良い考えではありません。このアンチパターンを使用しているのは、静的インポート ( で導入された) を知らないかJava 5.0、適切なクラスで定数をディスパッチするのが面倒だからだと思います。代わりに、1 つのインターフェイスを作成し、すべてのクラスにそれを実装させます。

編集:ちなみに、質問は私のように聞こえます-シーイングが良好であれば、望遠鏡を使用して近所のテレビを見て、テレビを見るのは良い考えですか. 答えは簡単です。いいえ、望遠鏡は他の目的のために発明されたものです。ああ、私はこの例がばかげていることを知っています:)

于 2010-08-23T13:58:15.973 に答える