मुझे आशा है कि उन्हें इस बात से कोई आपत्ति नहीं है कि मैं सामग्री की प्रतिलिपि बनाता हूं।
यह अंतिम क्षेत्रों की एक अच्छी व्याख्या है, लेकिन यह वास्तव में कॉन्स्ट कंस्ट्रक्टरों को नहीं समझाता है। इन उदाहरणों में कुछ भी वास्तव में उपयोग नहीं करता है कि निर्माणकर्ता निर्माणकर्ता हैं। किसी भी वर्ग में अंतिम क्षेत्र, कास्ट कंस्ट्रक्टर या नहीं हो सकते हैं।
डार्ट का एक क्षेत्र वास्तव में एक गुमनाम स्टोरेज लोकेशन है जो स्वचालित रूप से बनाए गए गेटटर और सेटर के साथ संयुक्त है जो स्टोरेज को पढ़ता और अपडेट करता है, और इसे एक कंस्ट्रक्टर की इनिशियलाइज़र सूची में आरंभीकृत भी किया जा सकता है।
अंतिम फ़ील्ड समान है, बस सेटर के बिना, इसलिए इसका मान सेट करने का एकमात्र तरीका कंस्ट्रक्टर इनिशियलाइज़र सूची में है, और उसके बाद मूल्य बदलने का कोई तरीका नहीं है - इसलिए "अंतिम"।
कॉन्स्ट कंस्ट्रक्टर्स की बात अंतिम फील्ड्स को इनिशियलाइज़ करने की नहीं है, कोई भी जेनेरिक कंस्ट्रक्टर ऐसा कर सकता है। बिंदु संकलन-समय स्थिर मान बनाने के लिए है: वे ऑब्जेक्ट जहां सभी फ़ील्ड मान पहले से ही संकलित समय पर ज्ञात हैं, बिना किसी कथन को निष्पादित किए।
यह वर्ग और निर्माता पर कुछ प्रतिबंध लगाता है। एक कंस्ट्रक्टर कंस्ट्रक्टर के पास बॉडी नहीं हो सकती है (कोई स्टेटमेंट निष्पादित नहीं किया गया है!) और उसकी क्लास में कोई नॉन-फाइनल फील्ड नहीं होना चाहिए (संकलन समय पर हम जो "जानते हैं" बाद में बदलने में सक्षम नहीं होना चाहिए)। प्रारंभिक सूची को केवल अन्य संकलन-समय स्थिरांक के लिए फ़ील्ड्स को इनिशियलाइज़ करना होगा, इसलिए राइट-हैंड साइड "कंपाइल-टाइम कंटीन्यूअस एक्सप्रेशंस" [1] तक सीमित हैं। और इसे "कॉन्स्ट" के साथ उपसर्ग करना होगा - अन्यथा आपको बस एक सामान्य निर्माता मिलता है जो उन आवश्यकताओं को पूरा करने के लिए होता है। यह पूरी तरह से ठीक है, यह सिर्फ एक कंस्ट्रक्टर नहीं है।
वास्तव में एक संकलन-समय स्थिर ऑब्जेक्ट बनाने के लिए एक कॉन्स्ट कंस्ट्रक्टर का उपयोग करने के लिए, आप फिर "कॉन्स्ट" के साथ "न्यू" को "न्यू" -प्रिक्रिया में बदल देते हैं। आप अभी भी एक कंस्ट्रक्टर के साथ "नए" का उपयोग कर सकते हैं, और यह अभी भी एक ऑब्जेक्ट बनाएगा, लेकिन यह केवल एक सामान्य नई ऑब्जेक्ट होगा, न कि एक संकलन-समय निरंतर मूल्य। वह यह है: एक कॉन्स्ट कंस्ट्रक्टर को रन टाइम पर ऑब्जेक्ट्स बनाने के लिए एक सामान्य कंस्ट्रक्टर के रूप में भी इस्तेमाल किया जा सकता है, साथ ही कंपाइल-टाइम कंटिन्यू ऑब्जेक्ट्स को कॉम्पीलेशन टाइम पर बनाया जा सकता है।
तो, एक उदाहरण के रूप में:
class Point {
static final Point ORIGIN = const Point(0, 0);
final int x;
final int y;
const Point(this.x, this.y);
Point.clone(Point other): x = other.x, y = other.y; //[2]
}
main() {
// Assign compile-time constant to p0.
Point p0 = Point.ORIGIN;
// Create new point using const constructor.
Point p1 = new Point(0, 0);
// Create new point using non-const constructor.
Point p2 = new Point.clone(p0);
// Assign (the same) compile-time constant to p3.
Point p3 = const Point(0, 0);
print(identical(p0, p1)); // false
print(identical(p0, p2)); // false
print(identical(p0, p3)); // true!
}
संकलन-समय स्थिरांक को विहित किया जाता है। इसका मतलब है कि आप कितनी बार "कॉन्स्ट पॉइंट (0,0)" लिखते हैं, आप केवल एक ऑब्जेक्ट बनाते हैं। यह उपयोगी हो सकता है - लेकिन उतना नहीं जितना यह प्रतीत होता है, क्योंकि आप मूल्य को पकड़ने के लिए एक कांस्टेबल चर बना सकते हैं और इसके बजाय चर का उपयोग कर सकते हैं।
तो, क्या संकलन-समय स्थिरांक वैसे भी अच्छे हैं?
- वे एनम के लिए उपयोगी हैं।
- स्विच मामलों में आप संकलन-समय निरंतर मान का उपयोग कर सकते हैं।
- उनका उपयोग एनोटेशन के रूप में किया जाता है।
डैज़ल को वैरिएबल इनिशियलाइज़ करने के लिए स्विच करने से पहले कंपाइल-टाइम कॉन्स्टेंट अधिक महत्वपूर्ण हुआ करते थे। इससे पहले, आप केवल "var x = foo;" जैसा एक आरंभिक वैश्विक चर घोषित कर सकते थे; यदि "फू" एक संकलन-समय स्थिर था। उस आवश्यकता के बिना, अधिकांश कार्यक्रमों को किसी भी कास्ट ऑब्जेक्ट का उपयोग किए बिना लिखा जा सकता है
इसलिए, संक्षिप्त सारांश: कांस्ट कंस्ट्रक्टर केवल संकलन-समय स्थिर मान बनाने के लिए हैं।
/ एल
[१] या वास्तव में: "संभावित रूप से संकलन-समय स्थिर अभिव्यक्ति", क्योंकि यह निर्माण मापदंडों को भी संदर्भित कर सकता है। [२] तो हाँ, एक कक्षा में एक ही समय में कब्ज और गैर-कास्ट कंस्ट्रक्टर दोनों हो सकते हैं।