익명 클래스는 기본적으로 람다와 같지만 구문이 좋지 않습니다 ... 이것은 사실이지만 구문이 더 나쁘고 로컬 변수가 포함 클래스로 유출되도록합니다.
부모 클래스의 필드로 만들어 최종 변수에 액세스 할 수 없습니다.
예 :
상호 작용:
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();
}
그들이 자바 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
클로징 방법에서 로컬 변수를 참조 할 수 있습니다 .