जवाबों:
डार्ट की वेबसाइट पर एक पोस्ट है और यह इसे बहुत अच्छी तरह से समझाता है।
अंतिम:
"फाइनल" का अर्थ एकल असाइनमेंट है: एक अंतिम चर या क्षेत्र में एक इनिशलाइज़र होना चाहिए । एक बार एक मान निर्दिष्ट करने के बाद, एक अंतिम चर का मूल्य नहीं बदला जा सकता है। अंतिम चर को संशोधित करता है ।
कॉन्स्ट:
"const" का अर्थ है कि डार्ट में थोड़ा अधिक जटिल और सूक्ष्म। const मानों को संशोधित करता है । आप इसका उपयोग तब कर सकते हैं जब संग्रह बनाते हैं, जैसे const [1, 2, 3], और जब const (2 के रूप में) नए ऑब्जेक्ट्स का निर्माण करते हैं (2, 3)। यहां, कॉन्स्ट का मतलब है कि वस्तु की संपूर्ण गहरी स्थिति को पूरी तरह से संकलन के समय पर निर्धारित किया जा सकता है और यह कि ऑब्जेक्ट जमे हुए और पूरी तरह से अपरिवर्तनीय होगा।
कास्ट ऑब्जेक्ट्स में कुछ दिलचस्प गुण और प्रतिबंध हैं:
उन्हें उस डेटा से बनाया जाना चाहिए, जिसकी गणना संकलन समय पर की जा सकती है। एक कास्ट ऑब्जेक्ट में रनटाइम पर गणना करने के लिए आपके पास किसी भी चीज की पहुंच नहीं होती है। 1 + 2 एक वैध कास्ट एक्सप्रेशन है, लेकिन नया DateTime.now () नहीं है।
वे गहराई से, संक्रामक रूप से अपरिवर्तनीय हैं। यदि आपके पास एक अंतिम फ़ील्ड है जिसमें संग्रह है, तो वह संग्रह अभी भी परिवर्तनशील हो सकता है। यदि आपके पास एक कास्ट कलेक्शन है, तो उसमें सब कुछ भी कॉन्स्टेबल, रिकर्सिबल होना चाहिए।
वे विहित हैं । यह स्ट्रिंग इंटर्निंग की तरह है: किसी भी दिए गए कास्ट वैल्यू के लिए, एक सिंगल कास्ट ऑब्जेक्ट बनाया जाएगा और फिर से उपयोग नहीं किया जाएगा कि कितनी बार कॉन्स्टेंस एक्सप्रेशन का मूल्यांकन किया जाता है।
कॉन्स्ट:
यदि आपके पास मूल्य की गणना रनटाइम पर की जाती है ( new DateTime.now()
उदाहरण के लिए), तो आप इसके लिए एक कास्ट का उपयोग नहीं कर सकते हैं । हालांकि, अगर मूल्य संकलन समय (कम से जाना जाता है const a = 1;
), तो आप का उपयोग करना चाहिए const
से अधिक final
। के बीच 2 अन्य बड़े अंतर हैं const
और final
। सबसे पहले, यदि आप उपयोग कर रहे हैं, तो आपको const
इसे static const
केवल के बजाय घोषित करना होगा const
। दूसरे, यदि आपके पास एक const
संग्रह है, तो उसके अंदर सब कुछ अंदर है const
। यदि आपके पास एक final
संग्रह है, तो उसके अंदर सब कुछ नहीं है final
।
अंतिम: यदि आप संकलन समय पर मूल्य नहीं जानते हैं, तो
final
इसका उपयोग किया जाना चाहिए const
, और यह रनटाइम पर गणना / पकड़ा जाएगा। यदि आप एक HTTP प्रतिक्रिया चाहते हैं जिसे बदला नहीं जा सकता है, यदि आप डेटाबेस से कुछ प्राप्त करना चाहते हैं, या यदि आप किसी स्थानीय फ़ाइल से पढ़ना चाहते हैं, तो उपयोग करें final
। कुछ भी जो संकलन समय पर ज्ञात नहीं है, final
खत्म हो जाना चाहिए const
।
इसके साथ ही जा रहा है की सभी ने कहा, दोनों const
और final
पुन: असाइन नहीं किया जा सकता है, लेकिन एक में खेतों final
वस्तु, जब तक कि वे नहीं कर रहे हैं const
या final
, (विपरीत पुन: असाइन किया जा सकता है const
)।
const
कब और किसका उपयोग करना चाहिए final
? क्या आप इन संशोधक के लिए किसी प्रकार का उपयोग-मामला जानते हैं?
मूल्य संकलन-समय पर ज्ञात होना चाहिए ,
const birthday = "2008/12/26"
प्रारंभ के बाद परिवर्तित नहीं किया जा सकता।
मूल्य रन-टाइम पर ज्ञात होना चाहिए ,
final birthday = getBirthDateFromDB()
प्रारंभ के बाद बदला नहीं जा सकता।
समेकित @Meyi और @ faisal-naseer उत्तर और छोटी प्रोग्रामिंग के साथ तुलना।
const कीवर्ड का उपयोग कंपाइल समय स्थिर मान को संचय करने के लिए किया जाता है । संकलित समय निरंतर मान एक मूल्य है जो संकलित करते समय निरंतर होगा :-)
उदाहरण के लिए 5
एक संकलन समय स्थिर है। जबकि DateTime.now()
वह संकलन समय स्थिर नहीं है। क्योंकि यह विधि उस समय वापस आ जाएगी जब लाइन रनटाइम पर निष्पादित हो रही हो। इसलिए हम DateTime.now()
एक const
वैरिएबल को असाइन नहीं कर सकते ।
const a = 5;
// Uncommenting below statement will cause compile time error.
// Because we can't able to assign a runtime value to a const variable
// const b = DateTime.now();
एक ही लाइन पर आरंभीकृत किया जाना चाहिए ।
const a = 5;
// Uncommenting below 2 statement will cause compilation error.
// Because const variable must be initialized at the same line.
// const b;
// b = 6;
नीचे उल्लिखित सभी कथन स्वीकार्य हैं।
// Without type or var
const a = 5;
// With a type
const int b = 5;
// With var
const var c = 6;
क्लास लेवल कास्ट वैरिएबल को नीचे की तरह इनिशियलाइज़ किया जाना चाहिए।
Class A {
static const a = 5;
}
इंस्टेंस लेवल कॉन्स्टेबल वेरिएबल संभव नहीं है ।
Class A {
// Uncommenting below statement will give compilation error.
// Because const is not possible to be used with instance level
// variable.
// const a = 5;
}
वस्तु को अपरिवर्तनीयconst
बनाने के लिए एक अन्य प्रमुख उपयोग किया जाता है । क्लास ऑब्जेक्ट को अपरिवर्तनीय बनाने के लिए हमें कंस्ट्रक्टर के साथ कॉन्स्टेबल कीवर्ड का उपयोग करना होगा और सभी फ़ील्ड्स को अंतिम रूप में नीचे बताए अनुसार बनाना होगा।
Class A {
final a, b;
const A(this.a, this.b);
}
void main () {
// There is no way to change a field of object once it's
// initialized.
const immutableObja = const A(5, 6);
// Uncommenting below statement will give compilation error.
// Because you are trying to reinitialize a const variable
// with other value
// immutableObja = const A(7, 9);
// But the below one is not the same. Because we are mentioning objA
// is a variable of a class A. Not const. So we can able to assign
// another object of class A to objA.
A objA = const A(8, 9);
// Below statement is acceptable.
objA = const A(10, 11);
}
हम एक सूची में कॉन्स्टेबल कीवर्ड का उपयोग कर सकते हैं ।
const a = const [] - एक वैरिएबल जिसका a
प्रारंभ वस्तुओं const
की एक सूची के रूप में किया जाता हैconst
(यानी, सूची में केवल संकलन समय स्थिर और अपरिवर्तनीय वस्तुएं होनी चाहिए)। इसलिए हम a
दूसरी सूची के साथ असाइन नहीं कर सकते ।
var a = const [] - एक वैरिएबल a
इनिशियलाइज़ किया var
गया है जिसमें एक लिस्ट const
ऑब्जेक्ट्स होते हैं । इसलिए हम वैरिएबल को एक और लिस्ट सौंप सकते हैंa
।
Class A {
final a, b;
const A(this.a, this.b);
}
class B {
B(){ // Doing something }
}
void main() {
const constantListOfInt = const [5, 6, 7,
// Uncommenting below statement give compilation error.
// Because we are trying to add a runtime value
// to a constant list
// DateTime.now().millisecondsSinceEpoch
];
const constantListOfConstantObjA = const [
A(5, 6),
A(55, 88),
A(100, 9),
];
// Uncommenting below 2 statements will give compilation error.
// Because we are trying to reinitialize with a new list.
// constantListOfInt = [8, 9, 10];
// constantListOfConstantObjA = const[A(55, 77)];
// But the following lines are little different. Because we are just
// trying to assign a list of constant values to a variable. Which
// is acceptable
var variableWithConstantList = const [5, 6, 7];
variableWithConstantList = const [10, 11, 15];
var variableOfConstantListOfObjA = const [A(5, 8), A(7, 9), A(10, 4)];
variableWithConstantList = const [A(9, 10)];
}
अंतिम कीवर्ड का उपयोग चर को स्थिर मान रखने के लिए भी किया जाता है । एक बार आरंभ करने के बाद हम मूल्य को बदलने में सक्षम नहीं हो सकते।
final a = 5;
// Uncommenting below statement will give compilation error.
// Because a is declared as final.
// a = 6;
नीचे उल्लिखित सभी कथन स्वीकार्य हैं।
// Without type or var
final a = 5;
// With a type
final int b = 5;
// With var
final var c = 6;
रनटाइम मान असाइन करने में सक्षम हो सकता है ।
// DateTime.now() will return the time when the line is getting
// executed. Which is a runtime value.
final a = DateTime.now();
var b = 5;
final c = b;
कक्षा स्तर के अंतिम चर को एक ही पंक्ति में आरंभीकृत किया जाना चाहिए।
Class A {
static final a = 5;
static final b = DateTime.now();
}
इंस्टेंस लेवल फाइनल वैरिएबल को एक ही लाइन या कंस्ट्रक्टर इनिशियलाइज़ेशन में आरंभीकृत किया जाना चाहिए। जब ऑब्जेक्ट बनाया जाता है तो मूल्य को मेमोरी में डाल दिया जाएगा।
Class A {
final a = 5;
}
// Constructor with a parameter.
Class B {
final b;
B(this.b);
}
// Constructor with multiple parameter.
Class C {
final c;
C(this.c, int d) {
// Do something with d
}
}
void main() {
A objA = new A();
B objB = new B(5);
C objC = new C(5, 6);
}
एक सूची सौंपना ।
final a = [5, 6, 7, 5.6, A()];
// Uncommenting Below statement will give compilation error.
// Because we are trying to reinitialize the object with another list.
// a = [9.9, 10, B()];
@Meyi द्वारा उत्तर का विस्तार
biggestNumberOndice
केवल मान का उपयोग करते हैं तो मूल्य को इनिशियलाइज़ किया जाएगा और मेमोरी को असाइन किया जाएगा)।const आंतरिक रूप से अंतिम रूप से अंतिम है लेकिन मुख्य अंतर यह है कि इसका संकलन समय स्थिर है जो संकलन के दौरान आरंभीकृत किया जाता है, भले ही आप इसके मूल्य का उपयोग न करें यह आरंभिक हो जाएगा और स्मृति में जगह लेगा।
वर्गों से परिवर्तनीय अंतिम हो सकता है लेकिन स्थिर नहीं है और यदि आप कक्षा स्तर पर एक स्थिर चाहते हैं तो इसे स्थिर गति प्रदान करें।
कोड:
void main() {
// final demonstration
final biggestNumberOndice = '6';
// biggestNumberOndice = '8'; // Throws an error for reinitialization
// const
const smallestNumberOnDice = 1;
}
class TestClass {
final biggestNumberOndice = '6';
//const smallestNumberOnDice = 1; //Throws an error
//Error . only static fields can be declared as constants.
static const smallestNumberOnDice = 1;
}
दोनों final
और const
पुन: असाइन किए जाने से एक चर को रोकने के (कैसे करने के लिए इसी तरह के final
जावा में काम करता है या कैसे const
जावास्क्रिप्ट में काम करता है)।
अंतर यह है कि मेमोरी कैसे आवंटित की जाती है। मेमोरी को final
रनटाइम पर एक const
चर के लिए, और संकलन-समय पर एक चर के लिए आवंटित किया जाता है । final
क्योंकि कई कार्यक्रम चर किसी भी स्मृति की जरूरत नहीं होगी के बाद से कार्यक्रम तर्क उन्हें प्रारंभ करने के लिए फोन नहीं होगा संशोधक, अधिक सामान्यतः प्रयोग किया जाना चाहिए। एक const
चर के साथ आप मूल रूप से कंप्यूटर को बता रहे हैं, "अरे, मुझे इस चर के लिए स्मृति की आवश्यकता है क्योंकि मैं जानता हूं कि मुझे इसकी आवश्यकता है।"
इस तरह से उनके बारे में सोचना उनके वाक्यात्मक उपयोग में अंतर को समझना आसान बनाता है। मुख्य रूप से एक final
चर एक उदाहरण चर हो सकता है, लेकिन एक वर्ग पर एक चर const
होना चाहिए static
। ऐसा इसलिए है क्योंकि उदाहरण चर रनटाइम पर बनाए जाते हैं, और const
चर - परिभाषा के अनुसार - नहीं हैं। इस प्रकार, const
एक वर्ग पर चर होना चाहिए static
, जिसका अर्थ है कि उस चर की एक प्रति एक वर्ग पर मौजूद है, चाहे वह वर्ग त्वरित हो।
यह वीडियो इसे काफी सरलता से तोड़ता है: https://www.youtube.com/watch?v=9ZZL3iyf4Vk
यह लेख अधिक गहराई में जाता है और दोनों के बीच एक बहुत ही महत्वपूर्ण अर्थ अंतर को बताता है, अर्थात final
चर को const
संशोधित करता है और मूल्यों को संशोधित करता है, जो अनिवार्य रूप से केवल उन const
मूल्यों को शुरू करने में सक्षम होता है जो संकलन-समय पर व्युत्पन्न होते हैं।
https://news.dartlang.org/2012/06/const-static-final-oh-my.html
आप से आ रहे हैं C++
तो const
में Dart
है constexpr
में C++
और final
में Dart
है const
में C++
।
उपरोक्त केवल आदिम प्रकारों पर लागू होता है। हालांकि Dart
चिह्नित वस्तुओं final
में इसके सदस्यों के संदर्भ में परिवर्तनशील हैं।
const
C ++ में लगभग हमेशा यह निर्दिष्ट करने के लिए उपयोग किया जाता है कि कोई वस्तु किसी विशिष्ट संदर्भ या सूचक के माध्यम से उत्परिवर्तित नहीं होती है। final
Dart उस चर के माध्यम से उत्परिवर्तित होने से ऑब्जेक्ट को रोकता नहीं है।
किस कीवर्ड का उपयोग कब करें?
दोनों के लिए एक सरल उदाहरण: फाइनल का उपयोग करें: यदि आप नहीं जानते कि इसका मूल्य संकलन-समय पर क्या होगा। उदाहरण के लिए, जब आपको एपीआई से डेटा प्राप्त करने की आवश्यकता हो सकती है, तो यह आपके कोड को चलाते समय होता है।
Const का उपयोग करें: यदि आप सुनिश्चित हैं कि आपके कोड को चलाते समय कोई मान नहीं बदला जाएगा। उदाहरण के लिए, जब आप एक वाक्य की घोषणा करते हैं जो हमेशा एक ही रहता है।
https://itnext.io/difference-between-const-and-final-in-dart-78c129d0c573
const
: stackoverflow.com/questions/51576209/… और अंतिम विस्फोटfinal
निरंतर है (अंतिम कीवर्ड के साथ एक बार बनाया गया या असाइन नहीं किया जा सकता है) और आपको इसे एक बार इनिशियलाइज़ करना होगा।