Saya menemukan jawaban Lasse di blog Chris Storms sebagai penjelasan yang bagus.
Saya harap mereka tidak keberatan saya menyalin konten tersebut.
Ini adalah penjelasan yang bagus tentang bidang akhir, tetapi tidak benar-benar menjelaskan konstruktor const. Tidak ada dalam contoh ini yang benar-benar menggunakan bahwa konstruktor adalah konstruktor const. Setiap kelas dapat memiliki bidang akhir, konstruktor konstanta atau tidak.
Bidang di Dart sebenarnya adalah lokasi penyimpanan anonim yang digabungkan dengan pengambil dan penyetel yang dibuat secara otomatis yang membaca dan memperbarui penyimpanan, dan juga dapat diinisialisasi dalam daftar penginisialisasi konstruktor.
Bidang terakhir adalah sama, hanya tanpa penyetel, jadi satu-satunya cara untuk menyetel nilainya adalah dalam daftar penginisialisasi konstruktor, dan tidak ada cara untuk mengubah nilai setelah itu - karenanya "final".
Inti dari konstruktor const bukanlah untuk menginisialisasi bidang final, konstruktor generatif mana pun dapat melakukannya. Intinya adalah membuat nilai konstanta waktu kompilasi: Objek yang semua nilai bidangnya sudah diketahui pada waktu kompilasi, tanpa menjalankan pernyataan apa pun.
Itu menempatkan beberapa batasan pada kelas dan konstruktor. Konstruktor const tidak boleh memiliki isi (tidak ada pernyataan yang dieksekusi!) Dan kelasnya tidak boleh memiliki bidang non-final (nilai yang kita "ketahui" pada waktu kompilasi tidak boleh diubah nanti). Daftar penginisialisasi juga hanya harus menginisialisasi kolom ke konstanta waktu kompilasi lainnya, jadi sisi kanan dibatasi ke "ekspresi konstanta waktu kompilasi" [1]. Dan itu harus diawali dengan "const" - jika tidak, Anda akan mendapatkan konstruktor normal yang kebetulan memenuhi persyaratan tersebut. Itu baik-baik saja, itu bukan konstruktor const.
Untuk menggunakan konstruktor const untuk benar-benar membuat objek konstanta waktu kompilasi, Anda kemudian mengganti "baru" dengan "const" dalam ekspresi "baru". Anda masih dapat menggunakan "new" dengan konstruktor-konst, dan itu masih akan membuat sebuah objek, tetapi itu hanya akan menjadi objek baru yang normal, bukan nilai konstanta waktu kompilasi. Yaitu: Konstruktor konst juga dapat digunakan sebagai konstruktor normal untuk membuat objek pada waktu proses, serta membuat objek konstan waktu kompilasi pada waktu kompilasi.
Jadi, sebagai contoh:
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!
}
Konstanta waktu kompilasi dikanonikalisasi. Artinya, tidak peduli berapa kali Anda menulis "const Point (0,0)", Anda hanya membuat satu objek. Itu mungkin berguna - tetapi tidak sebanyak yang terlihat, karena Anda bisa membuat variabel const untuk menampung nilai dan menggunakan variabel sebagai gantinya.
Jadi, apa gunanya konstanta waktu kompilasi?
- Mereka berguna untuk enum.
- Anda dapat menggunakan nilai konstanta waktu kompilasi dalam kasus sakelar.
- Mereka digunakan sebagai anotasi.
Konstanta waktu kompilasi dulu lebih penting sebelum Dart beralih ke variabel inisialisasi yang lambat. Sebelumnya, Anda hanya dapat mendeklarasikan variabel global yang diinisialisasi seperti "var x = foo;" jika "foo" adalah konstanta waktu kompilasi. Tanpa persyaratan itu, sebagian besar program dapat ditulis tanpa menggunakan objek const
Jadi, ringkasan singkat: Konstruktor konst hanya untuk membuat nilai konstanta waktu kompilasi.
/ L
[1] Atau sebenarnya: "Kemungkinan ekspresi konstanta waktu kompilasi" karena mungkin juga merujuk ke parameter konstruktor. [2] Jadi ya, sebuah kelas dapat memiliki konstruktor const dan non-const pada saat yang bersamaan.