【Java】インタフェースinterfaceの変数がstatic finalなのはなぜですか?

1488 ワード

今日突然自分に聞いて、インタフェースの変数はどうしてstaticとfinalのですか?
static:必須です.インタフェースは多く継承できるからです.1つのクラスが2つのインタフェースを実装し、2つのインタフェースが同じ名前の変数を持つ場合、この変数はクラスで使用できます.staticでない場合、この変数はどのインタフェースから来たのか曖昧になります.したがって、実装クラス使用インタフェースの変数はインタフェース名で指定する必要があります.staticとするしかありません.
次の例を見てください.
public interface iface1 {
    int a = 10;
}
public interface iface2 {
    int a = 9;
}
public class impl implements iface1, iface2 {
    public static void main(String args[]){
        System.out.println(a);
    }
}

この場合、aに曖昧さがあるため、コンパイルエラーが報告されます.
Reference to 'a' is ambiguous, both 'iface1.a' and 'iface2.a' match

final:staticでなければならないので、すべてのサブクラスが共有され、インタフェースは抽象的であるため、サブクラスが値を変更すると他のすべてのサブクラスに影響を与えるため、サブクラスがこの値を変更することを許可すべきではないのでfinalと定義します.
これまで、インタフェースが定数を定義する必要があることは発見されていません.なぜjavaが設計されたときにinterfaceにドメインがあることを許可したのか分かりません.
もちろんinterfaceパッケージ定数を使用する人もいますが、これはeffective javaではインタフェースの誤用とされています.主にインタフェースリストを汚染し、サブクラスのネーミング空間を汚染するためです.
個人的にはjavaデザイナーは設計をそんなに絶妙にしたくないと思います.言語の角度からinterfaceで変数を定義することを禁止しています.それはプログラマーにこの空間を与えました.ただ、後続の発展の中で、実践の検証を経て、このような定義定数がインタフェースにある方法はよくないことがわかりました.だから、私たちはできるだけそうしません.設計者はこれをプログラマーに残してコントロールした.
effective javaで言うようにインターネットで定数を置くことは禁止できると思います.しかしinterfaceは、interfaceに定数を置くには、定数ライブラリとしてしか使用できません.抽象的またはクラス実装を提供するべきではありません.そうしないと、effective javaで言う問題が発生します.このinterfaceが抽象的なインタフェースである場合、定数を定義するべきではなく、別のクラスにすべての定数をカプセル化すべきで、2つしか選択できません.