1. ホーム

[解決済み】なぜJavaでは静的なネストされたインターフェースが使われるのでしょうか?

2022-04-04 20:55:53

質問

私たちのコードベースで静的なネストされたインターフェイスを見つけました。

class Foo {
    public static interface Bar {
        /* snip */
    }
    /* snip */
}

今まで見たことがない。元の開発者が手の届かないところにいる。そのため、SOにお願いすることになりました。

静的なインターフェースのセマンティクスとは何でしょうか?を削除すると何が変わるのでしょうか? static ? なぜこのようなことをするのでしょうか?

解決方法は?

上記の例のstaticキーワードは冗長であり(ネストされたインターフェースは自動的に"static")、削除してもセマンティクスに影響を与えません。同じことが、インターフェイスメソッドの "public" やインターフェイスフィールドの "public final" にも当てはまり、これらの修飾子は冗長で、ソースコードに混乱をもたらすだけです。

いずれにせよ、開発者は単にFoo.Barという名前のインターフェイスを宣言しているに過ぎないのです。FooにアクセスできないコードがFoo.Barにもアクセスできないことを除けば、包含するクラスとの関連付けはこれ以上ありません。(ソースコードから - Fooがpackage-privateであっても、バイトコードやリフレクションはFoo.Barにアクセスできます!)

外側のクラスからだけ使われることを想定しているのであれば、この方法でネストしたインターフェイスを作成し、新しいトップレベル名を作成しないようにすることは、許容されるスタイルです。例えば

public class Foo {
    public interface Bar {
        void callback();
    }
    public static void registerCallback(Bar bar) {...}
}
// ...elsewhere...
Foo.registerCallback(new Foo.Bar() {
    public void callback() {...}
});