Anonim sınıfların temelde lambdalar gibi olduğunu sanıyordum, ancak daha kötü sözdizimiyle ... bu doğru çıkıyor ama sözdizimi daha da kötü ve yerel değişkenlerin (ne olması gerektiği) kapsayıcı sınıfa sızmasına neden oluyor.
Hiçbir nihai değişkene, onları ana sınıfın alanları haline getirerek erişemezsiniz.
Örneğin
Arayüz:
public interface TextProcessor
{
public String Process(String text);
}
sınıf:
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();
}
Bunu java 8'de mi çözdüler bilmiyorum (EE dünyasında sıkışıp kaldım ve henüz 8'im yok) ama C #'da şöyle görünecek:
public string ToJson()
{
string key = null;
var typeProcessor = new JSONTypeProcessor(text => key + ":" + text);
foreach (var theKey in keys)
{
key = theKey;
typeProcessor.doStuffThatUsesLambda();
}
}
C # da ayrı bir arayüze ihtiyacınız yok ... Özledim! Kendimi java'da daha kötü tasarımlar yaparken buluyorum ve kendimi daha çok tekrar ediyorum çünkü bir şeyi yeniden kullanmak için java'ya eklemeniz gereken kod + karmaşıklık miktarı, çoğu zaman kopyalayıp yapıştırmaktan daha kötü.
final
Çevreleyen yöntemden yerel değişkenlere başvurabilirsiniz .