2016-12-22 7 views
1

誰もこのコードの背後にある概念を説明できますか?私は何を探したいのかわからないのですか?私はこのタイプのプログラミングについてもっと知りたいと思います。Javaインターフェイスとコールバックメソッド

private static interface A { 
    void apply(String name, int i, int j); 
} 
private final A method_A = (name, i, j) -> methodOne(name, i, j); 
private final A method_B = (name, i, j) -> methodTwo(name, i, j); 
public void methodOne(String name, int i, int j){ 
    // do something 
} 
public void methodTwo(String name, int i, int j){ 
    // do some other thing 
} 

おかげ

答えて

1

を書いて、よりコンパクトな方法である:

private static interface A { 
    void apply(String name, int i, int j); 
} 
private final A method_A = this::methodOne; 
private final A method_B = this::methodTwo; 
public void methodOne(String name, int i, int j){ 
    // do something 
} 
public void methodTwo(String name, int i, int j){ 
    // do some other thing 
} 

二つの変数method_Amethod_Bのタイプがあるだけで、通常の変数ですA。これに関する本当の特別なことは、変数に割り当てた値です - this::methodOne

私はあなたがクラスとインターフェイスについての知識と、そのインスタンスがどのように機能するかを前提としています。そうでない場合は、まずそれらのことを学びます。

Aにはメソッドが1つしかないため、メソッドを「格納」するタイプのように扱うことができます。私は理由を説明します。あなたが唯一のapplyメソッドを持つ匿名クラスを作成

private final A method_A = new A() { 
    @Override 
    public void apply(String name, int i, int j) { 
     EnclosingClass.this.methodOne(name, i, j); 
    } 
}; 

のJava 8の前に、あなたはこのような何かを書くでしょう。見る? method_Aオブジェクトはメソッドの実装以外何も格納していませんか?あなたはおそらく、今では想像できるとおり、それはすべてのシンタックスシュガーです

private final A method_A = this::methodOne; 

のJava 8ので、あなたの代わりにこのラムダ式を書くことができます。基本的にはmethod_AにはmethdOneが保存されます。その後、method_Aを渡すことができ、実際にはメソッドの実装を渡しています!

新しいストリームAPIはこれを利用し、することができますあなたは、のようなものです:

someList.stream().forEach(System.out::println); 
+0

ありがとうございます。ショートカットは面白いです! – theeminence

+0

@eteminence質問に答えたと思う場合は、チェックマークをクリックして回答を受け入れることを検討してください。 – Sweeper

+0

私はあなたの答えを受け入れました – theeminence

2

は、Java 8ので、一つの非デフォルト方法とインターフェイスはlambda-expressionsのように表すことができます。これらのインタフェースは、機能インタフェースとも呼ばれます。

あなたのコードは、methodOnemethodTwoのアダプタとして実装されているラムダ式として、インターフェイスAの2つのインスタンスを作成します。

基本的に、これはあなたのコードは、実際にこれにsimplfiedすることができ

... 

private final A method_A = new A{ 
    public void apply(String name, int i, int j){ 
     methodOne(name, i, j); 
    } 
}; 

private final A method_B = new A{ 
    public void apply(String name, int i, int j){ 
     methodOne(name, i, j); 
    } 
}; 

... 
+0

は説明をいただき、ありがとうございます。あなたが提供したリンクも、多くのことを詳しく説明しています。 – theeminence

関連する問題