浅谈Java 7的闭包与Lambda表达式之优劣
2010-06-15 00:00:00 来源:WEB开发网Func<int, int> func = #(int x)(x * MyClass.this.hashCode());
不过从另一段示例代码上看:
public class MyClass {
public int n = 3;
public void MyMethod() {
Func<int, int> func = #(int x)(x + n);
int r = func.invoke(5); // 8
}
}
由于Func对象上没有n,因此这里的n便是MyClass类里定义的n成员了。因此,Java的闭包并非不会捕获字面上下文里的成员,只是在SAM类型的情况下,字面范围内(lexical scope)成员的优先级会低于目标抽象类型的成员。
总体来说,对于SAM类型的支持上,我认为Java是有可取之处的,只是我始终认为这个做法会产生歧义,因为我印象中其他语言里的Lambda表达式似乎都是捕获字面上下文的(当然它们可能也没有SAM支持)。但是,如何在“歧义”和“优雅”之间做出平衡,我一时也找不到令人满意的答案。
硬伤:Checked Exception
Java相当于其他常见语言有一个特别之处,那就是Checked Exception。Checked Exception意味着每个方法要标明自己会抛出哪些异常类型(RuntimeException及其子类除外),这也是方法契约的一部分,编译器会强制程序员写出满足异常契约的代码。例如某个类库中定义了这样一个方法:
public void myMethod() throws AException, BException
其中throws后面标注的便是myMethod可能会抛出的异常。于是如果我们要写一个方法去调用myMethod,则可能是:
public void myMethodCaller() throws AException {
try {
myMethod();
} catch (BException ex) {
throw new AException(ex);
}
}
更多精彩
赞助商链接