এটি চূড়ান্ত ক্ষেত্রগুলির সূক্ষ্ম ব্যাখ্যা, তবে এটি সত্যিই কনস্ট্রাক্টরগুলি ব্যাখ্যা করে না। এই উদাহরণগুলির মধ্যে কিছুই আসলে ব্যবহার করে না যে কনস্ট্রাক্টররা কনস্ট্রাক্টর কনস্ট্রাক্টর। যে কোনও শ্রেণীর চূড়ান্ত ক্ষেত্র, কনস্ট্রাক্টর বা না থাকতে পারে।
ডার্টে একটি ক্ষেত্রটি হ'ল একটি বেনামে স্টোরেজ অবস্থান যা একটি স্বয়ংক্রিয়ভাবে তৈরি গেটর এবং সেটারের সাথে মিলিত হয় যা স্টোরেজটি পড়ে এবং আপডেট করে এবং এটি কোনও নির্মাণকারীর আরম্ভকারী তালিকায় আরম্ভও করা যেতে পারে।
একটি চূড়ান্ত ক্ষেত্র একই, কেবল সেটার ব্যতীত, সুতরাং এর মান নির্ধারণের একমাত্র উপায়টি কনস্ট্রাক্টর আরম্ভকারী তালিকায় রয়েছে এবং এর পরে মান পরিবর্তন করার কোনও উপায় নেই - সুতরাং "চূড়ান্ত"।
কনস্ট্রাক্ট কনস্ট্রাক্টরগুলির পয়েন্টটি চূড়ান্ত ক্ষেত্রগুলি আরম্ভ করার নয়, যে কোনও জেনারেটর কনস্ট্রাক্টর এটি করতে পারে। বিন্যাসটি কম্পাইল-টাইম ধ্রুবক মানগুলি তৈরি করা: অবজেক্টগুলি যেখানে কোনও ক্ষেত্রের মানগুলি কোনও বিবৃতি কার্যকর না করেই কমপাইল সময়ে ইতিমধ্যে জানা যায়।
যা ক্লাস এবং কনস্ট্রাক্টরকে কিছুটা বিধিনিষেধ দেয়। কনস্ট্রাক্ট কনস্ট্রাক্টরের একটি বডি থাকতে পারে না (কোনও বিবৃতি কার্যকর করা হয় না!) এবং এর শ্রেণিতে অবশ্যই কোনও চূড়ান্ত ক্ষেত্র থাকতে হবে না (সংকলনের সময় আমরা যে মূল্য "জানি" অবশ্যই এটি পরে পরিবর্তন করতে সক্ষম হবে না)। ইনিশিয়ালাইজার তালিকার ক্ষেত্রগুলি কেবলমাত্র অন্যান্য সংকলন-সময় ধ্রুবকের ক্ষেত্রেই আরম্ভ করতে হবে, তাই ডান দিকের দিকগুলি "সংকলন-সময়ের ধ্রুবক অভিব্যক্তি" এর মধ্যে সীমাবদ্ধ [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)" লিখুন তা নয়, আপনি কেবল একটি অবজেক্ট তৈরি করেন। এটি কার্যকর হতে পারে - তবে এটি যতটা মনে হবে ততটা নয়, যেহেতু আপনি মানটি ধরে রাখতে পরিবর্তে পরিবর্তনশীলটি ব্যবহার করতে পারেন এবং পরিবর্তে ভেরিয়েবলটি ব্যবহার করতে পারেন।
সুতরাং, সংকলন-সময় ধ্রুবকগুলি যাইহোক ভাল?
- তারা enums জন্য দরকারী।
- আপনি সুইচ ক্ষেত্রে সংকলন-সময় ধ্রুবক মান ব্যবহার করতে পারেন।
- এগুলি টিকা হিসাবে ব্যবহৃত হয়।
কম্বল-টাইম ধ্রুবকগুলি ডার্টটি অলসভাবে ভেরিয়েবলগুলি আরম্ভ করার আগে আরও গুরুত্বপূর্ণ হিসাবে ব্যবহৃত হত। তার আগে, আপনি কেবলমাত্র "var x = foo" এর মতো একটি প্রাথমিক গ্লোবাল ভেরিয়েবল ঘোষণা করতে পারতেন; যদি "foo" একটি সংকলন-সময় ধ্রুবক ছিল। যে প্রয়োজন ছাড়াই, বেশিরভাগ প্রোগ্রাম কোনও কনস্ট অবজেক্ট ব্যবহার না করেই লেখা যায়
সুতরাং, সংক্ষিপ্ত সংক্ষিপ্তসার: কনস্ট্রাক্টর কনস্ট্রাক্টরগুলি কেবল সংকলন-সময় ধ্রুবক মান তৈরি করার জন্য।
/ এল
[1] বা সত্যই: "সম্ভাব্য সংকলন-ধ্রুবক অভিব্যক্তি সংকলন" কারণ এটি নির্মাণকারীর পরামিতিগুলিকেও উল্লেখ করতে পারে। [2] সুতরাং হ্যাঁ, একটি শ্রেণীর একই সাথে উভয় কনস্ট্যান্ড এবং নন-কনস্ট্রাক্টর কনস্ট্রাক্টর থাকতে পারে।