-2

私はJava 8で機能的なインターフェースを持っています:

public interface IFuncLambda1 {
    public int someInt();
}

主に:

IFuncLambda1 iFuncL1 =  () -> 5;
System.out.println("\niFuncL1.someInt: " + iFuncL1.someInt());
iFuncL1 = () -> 1;
System.out.println("iFuncL1.someInt: " + iFuncL1.someInt());

これを実行すると、次のようになります。

iFuncL1.someInt: 5
iFuncL1.someInt: 1

この機能はそのままでいいのでしょうか?それは意図されていますか?

オーバーライドが実装クラスで行われ、ある時点で実装が変更される場合、そのメソッドが呼び出されるすべての場所で動作が同じになり、一貫性が保たれます。しかし、例のようにラムダ式を使用して動作/実装を変更すると、その動作はフローの後半で次の変更まで有効になります。これは信頼性が低く、従うのが難しいと感じます。

編集: @assylias someInt() の動作がどのように変更されたかわかりません... someInt にパラメーターを追加し、次のコードを使用するとどうなりますか:

IFuncLambda1 iFuncL1 =  (x) -> x - 1;
System.out.println("\niFuncL1.someInt: " + iFuncL1.someInt(var));
iFuncL1 = (x) -> x + 1;
System.out.println("iFuncL1.someInt: " + iFuncL1.someInt(var));

var が最終的な偶数である場合、それをクラスでどのように書き直しますか?

4

1 に答える 1

4

あなたの例で() -> 5は、あるオブジェクトであり、() -> 1別のオブジェクトです。それらを参照するためにたまたま同じ変数を使用していますが、それが Java での参照のしくみです。

ちなみに、匿名クラスを使用した場合とまったく同じように動作します。

IFuncLambda1 iFuncL1 =  new IFuncLambda1() { public int someInt() { return 5; } };
System.out.println("\niFuncL1.someInt: " + iFuncL1.someInt());
iFuncL1 =  new IFuncLambda1() { public int someInt() { return 1; } };
System.out.println("iFuncL1.someInt: " + iFuncL1.someInt());

または「通常の」クラスを使用します。

public static class A implements IFuncLambda1 {
    private final int i;
    public A(int i) { this.i = i; }
    public int someInt() { return i; }
}

IFuncLambda1 iFuncL1 =  new A(5);
System.out.println("\niFuncL1.someInt: " + iFuncL1.someInt());
iFuncL1 =  new A(1);
System.out.println("iFuncL1.someInt: " + iFuncL1.someInt());

ここでも の 2 つのインスタンスがありますがA、 を再割り当てすると、最初のインスタンスへの参照が失われますiFuncL1

于 2014-11-05T15:29:13.417 に答える