我以为匿名类基本上像lambdas一样,但是语法更差……事实证明这是事实,但是语法更糟,并且会导致(应该是)局部变量渗出到包含类中。
通过将最终变量置于父类的字段中,可以访问任何最终变量。
例如
接口:
public interface TextProcessor
{
public String Process(String text);
}
类:
private String _key;
public String toJson()
{
TextProcessor textProcessor = new TextProcessor() {
@Override
public String Process(String text)
{
return _key + ":" + text;
}
};
JSONTypeProcessor typeProcessor = new JSONTypeProcessor(textProcessor);
foreach(String key : keys)
{
_key = key;
typeProcessor.doStuffThatUsesLambda();
}
我不知道他们是否在Java 8中解决了这个问题(我被困在EE世界中,还没有得到8),但是在C#中看起来像这样:
public string ToJson()
{
string key = null;
var typeProcessor = new JSONTypeProcessor(text => key + ":" + text);
foreach (var theKey in keys)
{
key = theKey;
typeProcessor.doStuffThatUsesLambda();
}
}
您也不需要C#中的单独接口...我想念它!我发现自己在Java中进行了更糟糕的设计,并且重复了很多次,因为在Java中添加代码以重复使用某些东西所带来的代码量和复杂性要比仅仅复制和粘贴很多时间更糟糕。
final
从封闭方法中引用局部变量。