Lasse'nin Chris Storms blogundaki cevabını harika bir açıklama buluyorum.
Umarım içeriği kopyalamama aldırış etmezler.
Bu, son alanların güzel bir açıklamasıdır, ancak const yapıcılarını gerçekten açıklamaz. Bu örneklerdeki hiçbir şey aslında yapıcıların sabit kurucular olduğunu kullanmaz. Herhangi bir sınıfın son alanları, const yapıcıları olabilir veya olmayabilir.
Dart'taki bir alan, depolamayı okuyan ve güncelleyen otomatik olarak oluşturulan bir alıcı ve ayarlayıcıyla birleştirilmiş gerçekten anonim bir depolama konumudur ve ayrıca bir yapıcının başlatıcı listesinde başlatılabilir.
Ayarlayıcı olmadan son alan aynıdır, bu nedenle değerini ayarlamanın tek yolu yapıcı başlatıcı listesidir ve bundan sonra değeri değiştirmenin hiçbir yolu yoktur - dolayısıyla "son".
Const yapıcılarının amacı son alanları başlatmak değildir, herhangi bir üretici kurucu bunu yapabilir. Önemli olan derleme zamanı sabit değerleri yaratmaktır: Tüm alan değerlerinin herhangi bir ifade yürütmeden derleme zamanında zaten bilindiği nesneler.
Bu, sınıfa ve kurucuya bazı kısıtlamalar getirir. Bir const oluşturucunun bir gövdesi olamaz (çalıştırılan deyim yok!) Ve sınıfının nihai olmayan alanları olmamalıdır (derleme zamanında "bildiğimiz" değer daha sonra değiştirilememelidir). Başlatıcı listesi ayrıca alanları yalnızca diğer derleme zamanı sabitleriyle başlatmalıdır, bu nedenle sağ taraf "derleme zamanı sabiti ifadeleri" [1] ile sınırlıdır. Ve "const" öneki olmalıdır - aksi takdirde, bu gereksinimleri karşılayan normal bir kurucu elde edersiniz. Bu gayet iyi, sadece bir kurucu değil.
Derleme zamanı sabiti nesnesini gerçekten oluşturmak için bir const yapıcı kullanmak için, daha sonra "yeni" ifadesini "yeni" ifadesinde "const" ile değiştirirsiniz. Bir const-constructor ile hala "new" kullanabilirsiniz ve bu yine de bir nesne oluşturacaktır, ancak bu, derleme zamanı sabiti değil, normal yeni bir nesne olacaktır. Yani: Bir const yapıcı, çalışma zamanında nesneler oluşturmak için normal bir kurucu olarak ve derleme zamanında derleme zamanı sabit nesneler oluşturmak için de kullanılabilir.
Örnek olarak:
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!
}
Derleme zamanı sabitleri standartlaştırılmıştır. Bu, kaç kez "sabit Nokta (0,0)" yazarsanız yazın, yalnızca bir nesne oluşturduğunuz anlamına gelir. Bu yararlı olabilir - ancak göründüğü kadar değil, çünkü değeri tutmak için bir const değişkeni oluşturabilir ve onun yerine değişkeni kullanabilirsiniz.
Peki, derleme zamanı sabitleri neye yarar?
- Numaralandırmalar için kullanışlıdırlar.
- Anahtar durumlarda derleme zamanı sabiti değerlerini kullanabilirsiniz.
- Ek açıklama olarak kullanılırlar.
Derleme zamanı sabitleri, Dart değişkenleri tembel olarak başlatmaya geçmeden önce daha önemliydi. Bundan önce, yalnızca "var x = foo;" gibi başlatılmış bir global değişken bildirebilirdiniz. "foo" bir derleme zamanı sabiti ise. Bu gereklilik olmadan, çoğu program herhangi bir const nesnesi kullanılmadan yazılabilir.
Yani, kısa özet: Const yapıcıları sadece derleme zamanı sabit değerleri oluşturmak içindir.
/ L
[1] Veya gerçekten: "Potansiyel olarak derleme zamanı sabiti ifadeleri" çünkü aynı zamanda yapıcı parametrelerine de başvurabilir. [2] Yani evet, bir sınıf aynı anda hem const hem de const olmayan kuruculara sahip olabilir.