Я думал, что анонимные классы были в основном похожи на лямбды, но с худшим синтаксисом ... это оказывается правдой, но синтаксис еще хуже и заставляет (что должно быть) локальные переменные вытекать в содержащий класс.
Вы не можете получить доступ к окончательным переменным, превратив их в поля родительского класса.
Например
Интерфейс:
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
локальные переменные из включающего метода.