Enum ve tüm özellikleri - 1

"Merhaba, Amigo!"

"Merhaba, Amigo!"

"Size çok ilginç bir şeyden bahsedeceğim. Oldukça basit ama bu onu daha da ilginç kılıyor. Buna enum denir. Enum, bir değişkenin sahip olabileceği belirli değerler kümesini tanımlayan bir türdür. Bir bakalım. hemen bir örnekte:"

Enum sınıfının tanımı
public enum Direction
{
 UP,
 DOWN,
 LEFT,
 RIGHT,
}
Enum kullanma
Direction direction = Direction.LEFT;

if (direction == Direction.LEFT)
 direction = Direction.RIGHT;
else
 direction = Direction.DOWN;

"Yani sadece bir dizi değeri listeliyoruz ve hepsi bu mu?"

"Evet, bir sıralama ilan ediyoruz ve içindeki tüm olası değerleri virgülle ayırarak listeliyoruz."

"Kullanımı da oldukça kolay."

"Null olarak ayarlayabilir misin?"

"Evet, bir numaralandırma normal bir sınıftır veya daha doğrusu bir tür sınıf gibidir, arayüzlerin sınıflar gibi olmasına benzer."

"Öyleyse sınıfları kullanabileceğim her yerde enum kullanabilir miyim?"

"Evet."

"Bir sınıf içinde bir enum ilan edebilir miyim?"

"Evet."

"Ve bir enum miras mı?"

"Hayır, bir enum miras alamazsınız ve bir enum diğer sınıfları miras alamaz."

"Nedenmiş?"

"Çünkü Java derleyicisi numaralandırmaları yaklaşık olarak şuna dönüştürür:

public final class Direction extends Enum
{
 public static final Direction UP = new Direction();
 public static final Direction DOWN = new Direction();
 public static final Direction LEFT = new Direction();
 public static final Direction RIGHT = new Direction();

 private Direction() {} // Private constructor
}

"Bu örnekten de görebileceğiniz gibi:"

1) Direction sınıfı kesinlikle Enum sınıfını miras alır, bu nedenle başka hiçbir şeyi miras alamaz.

2) Direction sınıfı final olarak ilan edildi, bu yüzden başka hiçbir şey onu miras alamaz.

3) Direction sınıfının değişkenleri aslında public static final Direction değişkenleridir. Bu, onları kullanan kodda belirgindir:

Yön yön = Yön .LEFT ;

4) Direction sınıfı yalnızca bir oluşturucu içerir ve özeldir. Bu, Direction nesnelerinin yalnızca sınıf içindeki kod kullanılarak oluşturulabileceği anlamına gelir. Bildirilen nesneler dışında hiçbir nesne oluşturulamaz.

5) Yön değişkenlerine, mevcut Yön nesnelerinden herhangi birine bir referans atanabilir. Hepsi enum içinde ayarlanır. Bu türde başka nesne yok ve gelecekte de olmayacak.

6) Yön nesneleri, yalnızca basit bir referans karşılaştırması yapacak olan «==» kullanılarak karşılaştırılabilir."

"Çok net olduğunu söyleyemem ama senin örneğinden sonra çok daha net."

"Harika. O zaman işte size biraz daha bilgi:"

1) Her Yön nesnesinin kendine özgü bir numarası vardır. Birincisi (YUKARI) 0, ikincisi (AŞAĞI) 1, üçüncüsü (SOL) 2 vb. Ordinal() yöntemini kullanarak bu sayıyı alabilirsiniz. "Ekrana bak:

Direction direction = Direction.LEFT;
int index = direction.ordinal();
int index2 = Direction.RIGHT.ordinal();

2) Her enum, enum değerlerinin bir dizisini döndüren bir values ​​() yöntemine sahiptir.

int leftIndex = Direction.LEFT.ordinal();

Direction[] array = Direction.values();
Direction left = array[leftIndex];

"Bu, herhangi bir enum öğesinin dizinini alabileceğimiz ve ardından bu dizini kullanarak öğeyi tekrar alabileceğimiz anlamına gelir."

" Foreach döngüsünde bir enum da kullanabiliriz :"

for (Direction direction : Direction.values())
{
 System.out.println(direction);
}
Ekran çıkışı:
UP
DOWN
LEFT
RIGHT

"Bu, enum'un toString yöntemini geçersiz kıldığı anlamına mı geliyor? Ne de olsa şuna benzer bir şey göstermiyor:"
«com.codegym.Direction@123fd4»?

"Evet. Üstelik, her numaralandırma ve dolayısıyla Yön, bir Diziye dönüştürülebilir ve bunun tersi de geçerlidir."

Bir Diziye Dönüştür:
String left = Direction.LEFT.toString(); // left == "LEFT";
Bir String'i bir enum'a dönüştürün:
Direction direction = Direction.valueOf("LEFT");

"Ha anladım."

"Dizeyi, Direction'da olmayan valueOf işlevine iletirseniz ne olur? Örneğin, «AMIGO»?

"Ne düşünüyorsun?"

"Bir istisna?"

"Evet. Yasa Dışı Argüman İstisnası."

"Pekala, bu, numaralandırmalar dünyasına girişimizi tamamlıyor."