मेरे earlier question on incompletely constructed objects का जिक्र करते हुए, मेरे पास दूसरा प्रश्न है। जैसा कि जॉन स्कीट ने बताया, एक निर्माता के अंत में एक अंतर्निहित स्मृति बाधा है जो सुनिश्चित करता है कि final
फ़ील्ड सभी धागे के लिए दृश्यमान हैं। लेकिन क्या होगा अगर एक कन्स्ट्रक्टर दूसरे कन्स्ट्रक्टर को कॉल करता है; उनमें से प्रत्येक के अंत में ऐसी याददाश्त बाधा है, या केवल उस व्यक्ति के अंत में जिसे पहली जगह बुलाया गया है?रचनाकारों को चेन करते समय जेवीएम की अंतर्निहित स्मृति बाधाएं कैसे व्यवहार करती हैं?
public class ThisEscape {
public ThisEscape(EventSource source) {
source.registerListener(
new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
});
}
}
और सही एक कारखाने विधि संस्करण होगा:
public class SafeListener {
private final EventListener listener;
private SafeListener() {
listener = new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
}
}
public static SafeListener newInstance(EventSource source) {
SafeListener safe = new SafeListener();
source.registerListener(safe.listener);
return safe;
}
}
चाहेंगे निम्नलिखित काम भी, या नहीं है कि, जब "गलत" समाधान है?
public class MyListener {
private final EventListener listener;
private MyListener() {
listener = new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
}
}
public MyListener(EventSource source) {
this();
source.register(listener);
}
}
अद्यतन: आवश्यक सवाल है कि this()
वास्तव में कॉल निजी निर्माता ऊपर (इस स्थिति में वहाँ बाधा जहां इरादा है और सब कुछ सुरक्षित हो जाएगा) के लिए गारंटी है, या यह संभव है कि निजी कन्स्ट्रक्टर को को एक मेमोरी बाधा को बचाने के लिए ऑप्टिमाइज़ेशन के रूप में इनलाइन किया गया है (जिस स्थिति में सार्वजनिक कन्स्ट्रक्टर के अंत तक बाधा नहीं होगी)?
क्या this()
के नियम ठीक से कहीं परिभाषित हैं? यदि नहीं, तो मुझे लगता है कि हमें यह मानना चाहिए कि जंजीर रचनाकारों को रेखांकित करने की अनुमति है, और शायद कुछ JVMs या शायद javac
एस भी कर रहे हैं।
यह एकमात्र उत्तर है जो आधिकारिक संदर्भ के साथ समर्थित है। (यहां संदर्भ के लिए एक वास्तविक लिंक है: http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html)। केवल एक चीज मुझे आश्चर्य है कि क्या * फ्रीज * बिल्कुल मतलब है कहीं भी समझाया नहीं गया है (या कम से कम मुझे यह नहीं मिला)। –
मुझे एक ही समस्या थी, एक अनौपचारिक वर्णन है (http://www.cs.umd.edu/~pugh/java/memoryModel/CommunityReview.pdf), एक और औपचारिक परिभाषा में पाया जा सकता है (http: // www.cs.umd.edu/~pugh/java/memoryModel/newFinal.pdf) –