Ich dachte, anonyme Klassen wären im Grunde genommen wie Lambdas, aber mit schlechterer Syntax ... dies stellt sich als wahr heraus, aber die Syntax ist noch schlechter und führt dazu, dass (was sollte) lokale Variablen in die enthaltende Klasse ausbluten.
Sie können auf keine endgültigen Variablen zugreifen, indem Sie sie in Felder der übergeordneten Klasse umwandeln.
Z.B
Schnittstelle:
public interface TextProcessor
{
public String Process(String text);
}
Klasse:
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();
}
Ich weiß nicht, ob sie das in Java 8 geklärt haben (ich stecke in der EE-Welt fest und habe noch keine 8), aber in C # würde es so aussehen:
public string ToJson()
{
string key = null;
var typeProcessor = new JSONTypeProcessor(text => key + ":" + text);
foreach (var theKey in keys)
{
key = theKey;
typeProcessor.doStuffThatUsesLambda();
}
}
Sie brauchen auch keine separate Schnittstelle in c # ... Ich vermisse es! Ich finde mich dabei, schlechtere Designs in Java zu erstellen und mich mehr zu wiederholen, weil die Menge an Code + Komplexität, die Sie in Java hinzufügen müssen, um etwas wiederzuverwenden, schlimmer ist, als viel zu kopieren und einzufügen.
final
lokale Variablen aus der einschließenden Methode referenzieren .