2012-01-26 17 views
12

は、私は一つの質問を持っている仮想拡張メソッドは、今後のJava 8のリリースで

interface A { 
     void a(); 
     void b() default { System.out.println("b"); }; 
     void c() final { System.out.println("c"); }; 
    } 

のようなコードスニペットが表示されたら。 Javaで十分なsh * tを持っていないのですか?なぜこれが必要なのでしょうか?

+1

これはすばらしい拡張です。Javaを複数の継承の世界に近づけることになります。 – Perception

+0

@Perception "...すべての面倒な実装の詳細はありません..."どのように正確に? –

+1

コンストラクタチェイン、潜在的な名前の衝突、多態的なあいまいさ、コンパイラで定義する必要がある追加の複雑さの話もあまりない。ミックスインが現代語の多くの多重継承よりも一般的である理由と、この特徴が私に何かを思い出させる理由。 – Perception

答えて

7

私はあなたがこの会議を見てお勧め:http://medianetwork.oracle.com/media/show/16999

これは、すべてを説明。最も興味深いのは、コードベース全体を書き直すことなく、インターフェースを進化させることです。これは、大きなコードベースが進化し、ますます不自由にならないようにするための鍵です。

-1

「拡張メソッド」という概念は、「外部の世界」にさらされた設計のうまくいかないAPIをハック/修正するための最後のチャンスではないと思います。文法的な砂糖だけ。

+1

デザイナーが巧妙に才能を持っていないか、またはいくつかの機能がまだ存在しないために実際にインターフェースをデザインできなかったAPIがうまく設計されていないのですか?) – Voo

+0

@Voo APIデザイナーは、後で追加する必要があるメソッドが存在する可能性があることを認識してください。抽象クラスを使用することができましたが、インターフェースの不要なバイナリ互換性のある荷物を追加することなく「純粋な」抽象クラスを定義することができないという欠点があります。 –

+0

ああ、実際には "防御方法"。 –

36

これはScalaの人が絶対に怒ってしまうために必要です。彼らはすでに「形質」の形でかなり似通った機能を持っているので、これらの機能をこれらの機能と一緒にする必要があります。

文字通り、Java言語開発では、Scalaの人たちを怒らせることが最優先事項です。

+4

実際、私は仮想拡張メソッドは特性の[非常に不完全な実装](http://codecrafter.blogspot.ca/2012/06/java-8-virtual-extension-methods-are.html)であり、それ自体が角になります。 –

+15

明らかにJordãoはスケーラの男なので、計画は機能しています。 – ryber

+0

+1私を笑わせました! –

3

APIライターは、NoSuchMethodErrorsを発生させずにポストホックのインターフェイスを拡張できるので、これは素晴らしいことです。また、V1に対してコンパイルされたクラスに対して、V2のメソッドのデフォルトの実装を提供します。コードは魅力のように機能します。これにより、通常どおりV2に対してコンパイルされたクラスのデフォルト実装を上書きし、番号付きのインターフェイスを冗長化することもできます。私はそれもサイト使用の拡張方法よりも優れていると考えています。

+0

それは基本的にjdk作家のための援助ですよね? –

+0

いいえ、これはライブラリライターの援助です。V1.1でインタフェース(API)を拡張し、2.0に名前を変更して再コンパイルする必要がなくなりました。 –

+0

どうして?彼らはどこかでコードを変更する必要があります。 –

12

Java 8にはラムダとクロージャのサポートが含まれていることが予定されています。これはJava言語を近代化する大きな一歩となります。問題は、コレクションフレームワークのようなインターフェイスに基づく既存のライブラリは、これらの新しい機能を直接使用できないことです。既存の実装を壊すことなくメソッドをインタフェースに追加することはできません。単純にはコンパイルされません。

lambdaは持っていますが、標準のコレクションでは簡単に使用できません。これは、Java開発者にとって大きな脅威となります。ラムダを標準的なコレクションに統合するには、forEach,map、またはfilterのようなメソッドが非常に望ましいでしょう。

この問題を解決するには、インターフェイスのメソッドのデフォルト実装を定義する拡張メソッドという別の機能を追加します。既存のサブクラスはデフォルトのメソッドを使用しますが、特殊化された可能性のあるより優れた実装でメソッドをオーバーライドすることもできます。

延長方法の提案の詳細は、Java Enhancement Proposal 126にあります。

+0

ラムダにとって非常に便利なのとまったく同じ理由で、他のAPIにも役立ちます。最後に 'interface X'、' X2'、..もうこれ以上!良い頃。 – Voo

関連する問題