私は匿名クラスは基本的にラムダのようだと思っていましたが、構文が悪いです...これは真実であることが判明しましたが、構文はさらに悪く、ローカル変数が含まれているクラスにローカル変数を流出させます。
親クラスのフィールドにすることで、最終的な変数にアクセスすることはできません。
例えば
インターフェース:
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();
}
彼らがこれをJava 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
囲んでいるメソッドからローカル変数を参照できます。