-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

这个功能可以吗?是有意的吗?

如果重写将在实现类中完成,并且实现会在某个时候发生变化,那么在调用该方法的每个地方,行为都是相同的,我们将保持一致性。但是,如果我像示例中那样通过 lambda 表达式更改行为/实现,则该行为将仅在下一次更改之前有效,稍后在流程中。这感觉不可靠且难以遵循。

编辑:@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());

还有两个实例,A但是当你重新分配时你失去了对第一个实例的引用iFuncL1

于 2014-11-05T15:29:13.417 回答