1. ホーム
  2. java

[解決済み] インターフェース定数とは何ですか?

2022-05-10 10:39:36

質問

Javaを勉強しているのですが、Interfaceはpublic staticとfinalのフィールドを持つことができることを知りました。今のところ、これらの例を見たことがありません。これらのInterface定数の使用例にはどのようなものがありますか、また、Java Standard Libraryの中でいくつか見ることができますか?

どのように解決するのですか?

静的メンバをインターフェースに入れる(そしてそのインターフェースを実装する)ことは 悪い習慣です。 であり、そのための名前である 定型インターフェイスのアンチパターン という名前もあります。 効果的なJava の項目17を参照してください。

定型インターフェイスパターンはインターフェイスの使い方が悪い . クラスが内部でいくつかの定数を使用することは、実装の詳細です。定数インターフェースを実装すると、この実装の詳細がクラスのエクスポートされたAPIに漏れることになります。クラスが定数インターフェイスを実装していても、そのクラスのユーザーにとっては何の影響もありません。むしろ、ユーザーを混乱させるかもしれません。さらに悪いことに、これは約束事を意味します。将来のリリースでクラスが修正されて定数を使う必要がなくなったとしても、 バイナリ互換性を確保するためにそのインターフェイスを実装しなければならないのです。最終的でないクラスが定数インターフェイスを実装する場合、そのすべてのサブクラスはインターフェイス内の定数によって名前空間を汚染されることになります。

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

定数インターフェイスの落とし穴を避けるために(実装されるのを防ぐことができないため)、プライベートコンストラクタを持つ適切なクラスが好まれます(例は ウィキペディア ):

public final class Constants {

    private Constants() {
        // restrict instantiation
    }

    public static final double PI = 3.14159;
    public static final double PLANCK_CONSTANT = 6.62606896e-34;
}

また、定数を完全に修飾することなく (つまり、クラス名を前置きすることなく) アクセスするためには 静的インポート を使用します (Java 5 以降)。

import static Constants.PLANCK_CONSTANT;
import static Constants.PI;

public class Calculations {

    public double getReducedPlanckConstant() {
        return PLANCK_CONSTANT / (2 * PI);
    }
}