34

例を見てみましょう:

public interface Testerface {

    default public String example() {
        return "Hello";
    }

}

public class Tester implements Testerface {

    @Override
    public String example() {
        return Testerface.super.example() + " world!";
    }


}

public class Internet {

    public static void main(String[] args) {
        System.out.println(new Tester().example());
    }

}

簡単に言えば、これはHello world!. たとえば、データ ファイルを初期化し、実装クラスを離れてはならTesterface#exampleない機密内部値を返すなどです。Java がデフォルトのインターフェースメソッドでアクセス修飾子を許可しないのはなぜですか? それらを保護/非公開にすることができず、サブクラスによって潜在的に昇格できないのはなぜですか (親クラスを拡張するクラスがオーバーライドされたメソッドに対してより目に見える修飾子を使用できる方法と同様です)?

一般的な解決策は抽象クラスに移行することですが、私の特定のケースでは、列挙型のインターフェイスがあるため、ここでは当てはまりません。私はそれが見過ごされたか、インターフェースの背後にある元のアイデアが利用可能なメソッドの「契約」であるためだと思いますが、これで何が起こっているのかについての情報が欲しいと思います.

「 Java 8 インターフェイスメソッドで「final」が許可されないのはなぜですか? 」を読みました。

デフォルト メソッドの基本的な考え方は、デフォルトの実装を持つインターフェイス メソッドであり、派生クラスがより具体的な実装を提供できることです。

そして、可視性がその側面をまったく壊さないように思えます。

リンクされた質問と同様に、クローズするのに問題があるように見えるため、意見に基づくものではなく、この問題について信頼できる回答をいただければ幸いです。

4

1 に答える 1

48

Java 8 インターフェイス メソッドで「同期」が許可されない理由は何ですか? で見たように、Java 8インターフェースメソッドで「最終」が許可されないのはなぜですか? のように、インターフェイスを拡張して動作を定義することは、最初に思われるよりも微妙です。可能な修飾子のそれぞれに独自のストーリーがあることがわかりました。クラスがどのように機能するかをやみくもにコピーするだけの問題ではありません。(単一継承で機能する OO モデリングのツールは、多重継承では自動的に機能しないため、これは少なくとも後から考えると明らかです。)

明白な答えから始めましょう: インターフェイスは常にpublic メンバーのみを持つように制限されてきました。Java 8 ではデフォルト メソッドと静的メソッドをインターフェイスに追加しましたが、「より似た」ものにするためだけにすべてを変更する必要があるわけではありません。クラス。

synchronizedや とは異なり、final既定のメソッドをサポートするのは重大な間違いでした。特にプライベートなアクセシビリティが弱いことは、考慮すべき合理的な機能です。プライベート インターフェイス メソッドは、静的であれインスタンスであれ (これらは継承に関与しないため、デフォルトではないことに注意してください)、完全に賢明なツールです (ただし、非パブリック ヘルパー クラスによって簡単にシミュレートできます)。

実際、Java 8 でプライベート インターフェイス メソッドを実行することを検討しました。これは、リソースと時間の制約により、ほとんどがリストの一番下に落ちたものでした. この機能が、いつかやることリストに再び登場する可能性は十分にあります。(更新: インターフェースのプライベート メソッドは Java 9 で追加されました。)

ただし、パッケージ メソッドとプロテクト メソッドは見た目よりも複雑です。多重継承の複雑さと の真の意味の複雑さは、protectedあらゆる種類のそれほど面白くない方法で相互作用します。だから私はそのためにあなたの息を止めません。

つまり、簡単な答えは、プライベート インターフェイス メソッドは 8 で実行できたものですが、実行できたすべてを実行してまだ出荷することはできなかったため、削除されましたが、戻ってくる可能性があるということです。

于 2014-12-08T23:58:23.583 に答える