Myślałem, że anonimowe klasy są w zasadzie podobne do lambd, ale z gorszą składnią ... okazuje się, że jest prawdą, ale składnia jest jeszcze gorsza i powoduje (co powinno być) lokalne zmienne wyciekające do klasy zawierającej.
Nie możesz uzyskać dostępu do żadnych zmiennych końcowych, przekształcając je w pola klasy nadrzędnej.
Na przykład
Berło:
public interface TextProcessor
{
public String Process(String text);
}
klasa:
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();
}
Nie wiem, czy załatwili to w Javie 8 (utknąłem w świecie EE i jeszcze nie mam 8), ale w C # wyglądałoby to tak:
public string ToJson()
{
string key = null;
var typeProcessor = new JSONTypeProcessor(text => key + ":" + text);
foreach (var theKey in keys)
{
key = theKey;
typeProcessor.doStuffThatUsesLambda();
}
}
Nie potrzebujesz też osobnego interfejsu w c # ... Tęsknię za tym! Uważam, że robię gorsze projekty w Javie i powtarzam się częściej, ponieważ ilość kodu + złożoność, którą trzeba dodać w Javie, aby ponownie użyć czegoś, jest gorsza niż zwykłe kopiowanie i wklejanie dużo czasu.
final
zmiennych lokalnych z otaczającej metody.