pensé clases anónimas eran básicamente como lambdas pero con peor sintaxis ... esto resulta ser cierto, pero la sintaxis es aún peor y causas (lo que debería ser) las variables locales, que se desangra en el que contiene clase.
Puede acceder a ninguna variable final al convertirlas en campos de la clase principal.
Ej
Interfaz:
public interface TextProcessor
{
public String Process(String text);
}
clase:
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();
}
No sé si han ordenados esto en java 8 (estoy atascado en el mundo EE y no tiene 8 todavía) pero en C# se vería así:
public string ToJson()
{
string key = null;
var typeProcessor = new JSONTypeProcessor(text => key + ":" + text);
foreach (var theKey in keys)
{
key = theKey;
typeProcessor.doStuffThatUsesLambda();
}
}
No necesita una interfaz separada en C# tampoco ... ¡Lo extraño! Me encuentro haciendo peores diseños en Java y repitiéndome más porque la cantidad de código + complejidad que tienes que agregar en java para reutilizar algo es peor que simplemente copiar y pegar muchas veces.
Puede hacer referencia a variables locales 'finales' desde el método adjunto. –
Me gusta el aspecto de la sugerencia de Adam Mmlodzinski de definir un método privado que inicializa instancias privadas myVariable y se puede invocar en el corchete de cierre debido a la devolución de 'this'. – dlamblin
Esta pregunta tiene algunos objetivos compartidos de: http://stackoverflow.com/questions/362424/accessing-constructor-of-an-anonymous-class –