有効な Java の項目 17 で、Josh Bloch は、静的メンバーをインターフェイスに配置する (およびそのインターフェイスを実装する) ことは、定数インターフェイスのアンチパターンとして知られる悪い習慣であると主張しています。
定数インターフェイス パターンは、インターフェイスの不適切な使用です。クラスが内部的にいくつかの定数を使用することは、実装の詳細です。定数インターフェイスを実装すると、この実装の詳細がクラスのエクスポートされた API に漏れます。クラスが定数インターフェースを実装することは、クラスのユーザーにとって重要ではありません。実際、それは彼らを混乱させることさえあります。さらに悪いことに、これはコミットメントを表しています。将来のリリースで定数を使用する必要がなくなるようにクラスが変更された場合でも、バイナリ互換性を確保するためにインターフェイスを実装する必要があります。非最終クラスが定数インターフェイスを実装する場合、そのすべてのサブクラスの名前空間は、インターフェイスの定数によって汚染されます。
など、Java プラットフォーム ライブラリにはいくつかの定数インターフェイスがあります
java.io.ObjectStreamConstants
。これらのインターフェイスは異常とみなされるべきであり、エミュレートされるべきではありません。
私はこの背後にある理由を理解し、完全に同意すると確信しています。
私の質問は次のとおりです: 関連する定数をグループ化することです (注: これらは列挙型には適していません。関連する定数 pi と e の数学の例を検討してください) 対インスタンス化不可能なクラスでは、値にのみアクセスすることをお勧めします。静的参照と静的インポートを介して、デフォルトのアクセス修飾子を使用して API からインターフェイスを非表示にし、実際にインターフェイスを実装することはありませんか?
なぜですか、そうでないのですか?プライベートコンストラクターを使用して定数グループ化タイプがインスタンス化されないようにする以外に、それらをクラスにグループ化する利点はありますか?