web-dev-qa-db-ja.com

Java 8が非公開のデフォルトメソッドを許可しないのはなぜですか?

例を見てみましょう:

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がデフォルトのインターフェースメソッドでアクセス修飾子を許可しないのはなぜですか?サブクラスによって保護/プライベート化できず、潜在的に昇格できないのはなぜですか(クラスがと同様) extends親クラスはオーバーライドされたメソッドに対してより目に見える修飾子を使用できます)?

一般的な解決策は抽象クラスに移行することですが、私の特定のケースでは、列挙型のインターフェイスがあるため、ここでは適用されません。見落とされていたか、インターフェースの背後にある元々の考えが利用可能なメソッドの「契約」であるためだと思いますが、これで何が起こっているのかについての入力が必要だと思います。

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

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

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

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

31
Rogue

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

明白な答えから始めましょう:インターフェイスは常にパブリックメンバーのみを持つように制限されていますが、Java 8、それは私たちが単に「より似た」クラスになるためにすべてを変更しなければならないという意味ではありません。

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

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

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

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

43
Brian Goetz