次のようなコードスニペットを見ると
interface A {
void a();
void b() default { System.out.println("b"); };
void c() final { System.out.println("c"); };
}
一つ質問があります。Javaで十分なsh*tをすでに取得していませんか?なぜこれが必要なのですか?
次のようなコードスニペットを見ると
interface A {
void a();
void b() default { System.out.println("b"); };
void c() final { System.out.println("c"); };
}
一つ質問があります。Javaで十分なsh*tをすでに取得していませんか?なぜこれが必要なのですか?
これが必要なのは、Scalaの人たちを絶対に激怒させるからです。それらはすでに「特性」の形でかなり類似した機能を持っているので、今度はそれらをこれらと一緒に機能させる必要があります。
Scalaの連中を怒らせることは、Java言語開発において文字通り最優先事項です。
Java 8 には、何らかの形式のラムダとクロージャーのサポートが含まれることが計画されています。これは、Java 言語の近代化における大きな一歩となるでしょう。問題は、コレクション フレームワークなどのインターフェイスに基づく既存のライブラリが、これらの新しい機能を直接使用できないことです。既存の実装を壊さずにインターフェースにメソッドを追加することはできません。単純にコンパイルできなくなります。
ラムダを持っていても、標準コレクションで簡単に使用できないことは、Java 開発者にとって大きな失望となります。ラムダを標準コレクションに統合するにはforEach
、 、map
、または などのメソッドfilter
が非常に望ましいでしょう。
この問題の解決策は、別の機能である拡張メソッドを追加することです。拡張メソッドは、インターフェイス内のメソッドの既定の実装を定義します。既存のサブクラスはデフォルトのメソッドを使用しますが、メソッドを特殊化されたより適切な実装でオーバーライドすることもできます。
拡張メソッドの提案の詳細については、Java Enhancement Proposal 126を参照してください。
このカンファレンスをご覧になることをお勧めします: http://medianetwork.oracle.com/media/show/16999
これはすべてを説明します。最も興味深いのは、コードベース全体を書き直すことなくインターフェイスを進化させることです。これは、大規模なコードベースが進化し、ますます不自由にならないようにするための鍵です。
これは、API 作成者が NoSuchMethodError を発生させずにインターフェイスを事後拡張できるため、優れています。また、V1 に対してコンパイルされたクラスの V2 のメソッドにデフォルトの実装を提供します。コードは魅力のように機能します。これにより、通常どおり V2 に対してコンパイルされたクラスでデフォルトの実装をオーバーライドすることもでき、番号付きインターフェイスが冗長になります。ユースサイト拡張法よりも優れていると思います。
「拡張メソッド」の概念は、「外部の世界」にさらされた、設計が不十分な API をハッキング/修正する最後のチャンスにすぎないと私は信じています。ただのシンタックスシュガー。