Neden herhangi bir programlama dili özelliği kullanıyorsunuz? Hiç dilimizin olmasının nedeni
- Programcılar verimli ve doğru bir şekilde bilgisayarları algoritmaları ifade etmek için bir bilgisayar kullanabilirsiniz.
- Başkalarının yazdığı algoritmaları anlamak ve doğru şekilde değiştirmek için bakımcılar.
Enums, çok fazla kazan plakası yazmadan hem doğruluk hem de okunabilirlik olasılığını artırır. Boyler plakası yazmak istiyorsanız, numaralandırmayı "simüle edebilirsiniz":
public class Color {
private Color() {} // Prevent others from making colors.
public static final Color RED = new Color();
public static final Color AMBER = new Color();
public static final Color GREEN = new Color();
}
Şimdi yazabilirsiniz:
Color trafficLightColor = Color.RED;
Yukarıdaki kazan plakası ile aynı etkiye sahiptir.
public enum Color { RED, AMBER, GREEN };
Her ikisi de derleyiciden aynı düzeyde denetim yardımı sağlar. Boilerplate sadece daha fazla yazıyor. Ancak çok fazla yazarak programcıyı daha verimli hale getirir (bkz. 1), bu yüzden değerli bir özelliktir.
En az bir nedenden daha değerlidir:
Anahtar ifadeleri
O bir şey static final
enum simülasyon yukarıda gelmez değil size güzel switch
davaları. Numaralandırma türleri için Java anahtarı, numaralandırma durumlarının kapsamını çıkarmak için değişkeninin türünü kullanır, bu nedenle enum Color
yukarıdakiler için yalnızca şunu söylemeniz gerekir:
Color color = ... ;
switch (color) {
case RED:
...
break;
}
Color.RED
Durumlarda olmadığını unutmayın . Enum kullanmıyorsanız, adlandırılmış miktarları kullanmanın tek yolu switch
şudur:
public Class Color {
public static final int RED = 0;
public static final int AMBER = 1;
public static final int GREEN = 2;
}
Ama şimdi bir rengi tutacak bir değişkenin türü olmalıdır int
. Enum ve static final
simülasyonun güzel derleyici kontrolü gitti. Mutlu değil.
Bir uzlaşma, simülasyonda skaler değerli bir üye kullanmaktır:
public class Color {
public static final int RED_TAG = 1;
public static final int AMBER_TAG = 2;
public static final int GREEN_TAG = 3;
public final int tag;
private Color(int tag) { this.tag = tag; }
public static final Color RED = new Color(RED_TAG);
public static final Color AMBER = new Color(AMBER_TAG);
public static final Color GREEN = new Color(GREEN_TAG);
}
Şimdi:
Color color = ... ;
switch (color.tag) {
case Color.RED_TAG:
...
break;
}
Ama dikkat edin, daha da kazanı!
Bir enum'u singleton olarak kullanma
Yukarıdaki kazan plakasından, bir enumun neden bir tekliton uygulamak için bir yol sağladığını görebilirsiniz. Yazmak yerine:
public class SingletonClass {
public static final void INSTANCE = new SingletonClass();
private SingletonClass() {}
// all the methods and instance data for the class here
}
ve daha sonra
SingletonClass.INSTANCE
sadece söyleyebiliriz
public enum SingletonClass {
INSTANCE;
// all the methods and instance data for the class here
}
bize aynı şeyi verir. Bundan kaçabiliriz , çünkü Java enumları tam sınıflar olarak sadece biraz sözdizimsel şeker serpilir. Bu yine daha az kaynatma plakasıdır, ancak deyim size aşina olmadığı sürece açık değildir. Ben de onlar singleton için çok mantıklı olmasa bile çeşitli enum fonksiyonlarını olsun gerçeği sevmediğim: ord
ve values
vb (Orada bir hileli simülasyon aslında Color extends Integer
o anahtarı ile çalışacak, ama o kadar aldatıcı öyle daha neden enum
daha iyi bir fikir olduğunu açıkça gösteriyor .)
İplik güvenliği
İplik güvenliği, yalnızca kilitlenmeden tembel tembel temalar oluşturulduğunda potansiyel bir sorundur.
public class SingletonClass {
private static SingletonClass INSTANCE;
private SingletonClass() {}
public SingletonClass getInstance() {
if (INSTANCE == null) INSTANCE = new SingletonClass();
return INSTANCE;
}
// all the methods and instance data for the class here
}
Birçok iş parçacığı hala boşken getInstance
aynı anda çağrı yaparsa INSTANCE
, herhangi bir sayıda örnek oluşturulabilir. Bu kötü. Tek çözüm, synchronized
değişkeni korumak için erişim eklemektir INSTANCE
.
Ancak, static final
yukarıdaki kodda bu sorun yoktur. Örneği sınıf yükleme zamanında hevesle oluşturur. Sınıf yükleme senkronize edilir.
enum
İlk kullanımda kadar başlatılmadı çünkü tekil etkin bir tembel. Java başlatma da senkronize edilir, bu nedenle birden çok iş parçacığı birden çok örneğini başlatamaz INSTANCE
. Çok az kodla tembel bir şekilde başlatılmış singleton alıyorsunuz. Tek olumsuz, oldukça belirsiz sözdizimidir. Deyimi bilmeniz veya neler olduğunu bilmek için sınıf yükleme ve başlatmanın nasıl çalıştığını iyice anlamanız gerekir.