ฉันคิดว่าคลาสที่ไม่ระบุชื่อนั้นโดยทั่วไปแล้วเป็น lambdas แต่มีซินแทกซแย่กว่า ... นี่กลายเป็นจริง แต่ซินแทกซ์นั้นแย่ยิ่งกว่าเดิมและทำให้ตัวแปรในท้องถิ่น (สิ่งที่ควรจะเป็น) ทำให้มีเลือดออกในคลาสที่บรรจุอยู่
คุณสามารถเข้าถึงตัวแปรสุดท้ายโดยไม่ทำให้ตัวแปรเหล่านั้นเป็นฟิลด์ของคลาสพาเรนต์
เช่น
อินเตอร์เฟซ:
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 # เช่นกัน ... ฉันคิดถึงมัน! ฉันพบว่าตัวเองมีการออกแบบที่แย่ลงในจาวาและทำซ้ำตัวเองมากขึ้นเนื่องจากจำนวนของรหัส + ความซับซ้อนที่คุณต้องเพิ่มในจาวาเพื่อนำสิ่งที่เลวร้ายกลับมาใช้ซ้ำยิ่งกว่าการคัดลอกและวางเป็นจำนวนมาก
final
ตัวแปรโลคัลได้จากวิธีการปิดล้อม