Java 8の最も便利な機能の1つは、default
インターフェースの新しいメソッドです。それらが導入された理由は基本的に2つあります(他にもある場合があります)。
- 実際のデフォルト実装を提供します。例:
Iterator.remove()
- JDK APIの進化を可能にする。例:
Iterable.forEach()
APIデザイナーの観点から、インターフェイスメソッドで他の修飾子を使用できるようにしたいと思っていましたfinal
。これは、便利なメソッドを追加するときに役立ち、クラスの実装における「偶発的な」オーバーライドを防ぎます。
interface Sender {
// Convenience method to send an empty message
default final void send() {
send(null);
}
// Implementations should only implement this method
void send(String message);
}
上記がSender
クラスの場合、すでに一般的な方法です。
abstract class Sender {
// Convenience method to send an empty message
final void send() {
send(null);
}
// Implementations should only implement this method
abstract void send(String message);
}
さて、default
とfinal
明らかにキーワードを矛盾しているが、デフォルトでは自分自身をキーワード厳格に求められているだろう、私は微妙な違いを反映するために、この矛盾が意図的であると仮定しているので、「身体を持つクラス・メソッド」(ちょうどメソッド)と「インターフェースを本文付きのメソッド」(デフォルトのメソッド)、つまり、まだ理解していない違い。
ある時点で、Brian Goetzを引用して、インターフェースメソッドstatic
などの修飾子のサポートfinal
はまだ完全には検討されていませんでした。
もう1つの部分は、finalメソッド、privateメソッド、protectedメソッド、staticメソッドなど、インターフェイスでクラス構築ツールをどの程度サポートするかです。答えは、まだわかりません。
2011年後半のその時以来、明らかに、static
インターフェイスのメソッドのサポートが追加されました。明らかに、これはJDKライブラリ自体に、などの多くの価値を追加しましたComparator.comparing()
。
質問:
Java 8インターフェイスに到達しなかった理由final
(およびstatic final
)は何ですか?
final
ように、メソッドがオーバーライドされないようにし、インターフェイスから継承されたメソッドをオーバーライドする必要があることを確認すると、最終的にすることが理にかなっている理由がわかりません。メソッドを1回オーバーライドした後でメソッドが最終であることを示すことを除いて、その場合、おそらくQASの問題がありますか?この権利を理解していない場合は、kmowさせてください。おもしろそう
final
は、実装クラスがインターフェースメソッドのデフォルト実装をオーバーライドしないようにするのに役立ちます。