1. Nasıl enum
oluştuğuna dair arka plan
Bugün Java'da başka bir veri türünü keşfedeceğiz: enum
. Ad, numaralandırmaenum
kelimesinden gelir . Bu veri türü nedir ve ne için?
Bazen bir programcının, olası değerleri küçük bir sabit listeyle sınırlı yeni bir veri türü yaratması gerekir.
Örneğin bir tür sadece , , , ... DayOfTheWeek
değerlerini alabilir. Toplamda 7 değer vardır. Veya bir tür sadece , , , ... değerlerini alabilir. Toplamda 12 değer vardır.MONDAY
TUESDAY
WEDNESDAY
Month
JANUARY
FEBRUARY
MARCH
Elbette, şu sayıları kullanabilirsiniz ( int
tür): 1
— Pazartesi, — Salı, vb. Ancak birisi yanlışlıkla veya gibi değişkeninize 2
geçersiz değerler atayabilir .8
0
Bir programcının haftanın günlerinin (veya yılın aylarının) sıfırdan başlayarak numaralandırıldığını düşünürken, diğerlerinin numaralarının birden başlamasını beklediği vb. bir duruma kolaylıkla sahip olabilirsiniz.
Bu nedenle Java , sonlu bir değerler kümesindenenum
oluşan bir veri tipini tanıttı .
2. Bir tür bildirmek
Yeni bir veri türü bildirmek enum
şuna benzer:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
TypeName
Yeni türün (sınıfın) adı nerede ve olası değerler virgülle ayrılmış ve kaşlı ayraçlar içinde : Value1
, Value2
, Value3
.
Örnek olarak, kendimizinkini oluşturalım DayOfTheWeek
enum
:
kod | Not |
---|---|
|
Yeni Day tip Pazartesi Salı Çarşamba Perşembe Cuma Cumartesi Pazar |
Yeni türümüzdeki bir değişkene şu şekilde değer atayabilirsiniz:
Day day = Day.MONDAY;
Örnek:
kod | Not |
---|---|
|
Ekran çıktısı şöyle olacaktır:
|
3. Yöntemlerenum
Bir enum
türün, ikisi çok ilginç olan birkaç yerleşik yöntemi vardır:
Statik values()
yöntem, türün tüm değerlerinin bir dizisini döndürür enum
:
kod | Not |
---|---|
|
Değişken days , türün değerlerini içeren bir diziyi saklar Day (7 eleman) Dizinin içeriğini ekranda görüntüleyin:
|
Yöntem ordinal()
, sabitin sıra sayısını döndürür. enum
Bunu bir sınıf yerine bir değer olarak adlandırırsınız enum
:
kod | Konsol çıkışı |
---|---|
|
|
4. Bir sınıfa dönüştürme
Gerçekte, burada büyülü bir şey yok. Derleyici bize biraz sözdizimsel şeker verdi. Derleme zamanında, Day
enum sıradan bir sınıfa dönüştürülür:
Kod, basitleştirilmiş sürüm | Not |
---|---|
|
Day class Statik sabitlerin listesi Enum'un tüm değerlerini içeren bir dizi Belirli bir nesnenin değerini depolayan bir değişken Sınıfınki özeldir, yani sınıfın nesneleri yalnızca sınıf içinde yaratılabilir . Yöntem bir nesne üzerinde çağrılmalıdır . Nesnenin değerini yani alanı döndürür . Yöntem, sınıfın tüm değerlerini içeren statik bir dizi döndürür . Day Day Day constructor Day Day ordinal Day value Day |
Sınıftan tüm statik yöntemleri ve değişkenleri kaldırırsak Day
, aşağıdakileri elde ederiz:
kod | Not |
---|---|
|
Değişken , nesnenin value değerini depolar, nesneler yalnızca sınıf içinde oluşturulabilir , çünkü yapıcı . Yöntem , nesnenin değerini döndürür . Day Day Day private ordinal() value Day |
Başka bir deyişle, burada korkutucu bir şey olmuyor. Derleyici Day
sınıfı oluşturur, değerleri temsil eden sabitleri ekler enum
, gerekli yöntemleri ekler ve sınıfı yapıcı yapar private
. Yapıcıların nasıl çalıştığına biraz sonra bakacağız.
Umarız, bir değişkene neden bu şekilde bir değer atadığımız şimdi anlaşılmıştır:
Day day = Day.MONDAY;
MONDAY
sınıftaki sadece statik bir alandır (sabit) Day
. Statik metotlara ve sınıf dışından alanlara erişirken, alan veya metot adından önce sınıf adını belirtmelisiniz.
5. Daha fazla yöntemenum
Her enum
sınıfın birkaç ilginç özelliği vardır.
Bir diziye ve diziden dönüştürme
Bir enum nesnesini dizgeye dönüştürmek için yöntemini çağırmanız gerekir toString()
.
String str = Day.MONDAY.toString();
Diğer yönde (bir dizeden bir nesneye Day
) dönüştürmek için statik yöntemi kullanabilirsiniz valueOf()
:
Day day = Day.valueOf("MONDAY");
Süper kullanışlıdır ve birçok durumda yardımcı olacaktır.
Bir sayıya dönüştürme ve tekrar geri alma
enum
Bir nesneyi sayıya nasıl dönüştüreceğinizi zaten biliyorsunuz : ordinal()
yöntemi çağırın:
int index = Day.MONDAY.ordinal();
Diğer yönde dönüştürmek için (bir sayıdan Day
nesneye), daha şeffaf bir yapıya ihtiyacınız vardır:
Day day = Day.values()[2];
Örnekler:
kod | Not |
---|---|
|
Pazartesi Pazartesi indeksini alın: 0 Haftanın günü Pazartesiden 2 gün sonra |
Önemli nokta:enum
değerler sabit bir sabitler kümesi olduğundan , == kullanılarak karşılaştırılabilirler . MONDAY
Başka bir deyişle, farklı adreslere sahip iki özdeş nesneye sahip olamazsınız . Her enum değerinin yalnızca tek bir örneği mevcuttur. Bu, == kullanarak enum değişkenlerini karşılaştırmanın her zaman işe yarayacağı anlamına gelir.
6. Kendi yöntemlerinizi birenum
An, derleme zamanında sıradan bir sınıfa dönüştüğü için enum
, içinde yöntemler bildirebilirsiniz. Bu yöntemler derleyicinin ürettiği sınıfa eklenir. Örneğin, Day enum
bir dizi yerine enum değerlerinin bir listesini döndürmemizi istediğimizi varsayalım.
Ardından aşağıdaki kodu ekleyebiliriz:
kod | Not |
---|---|
|
Değerler listesinden sonra noktalı virgül gerekir. Bir ArrayList nesne oluşturun Yöntem tarafından döndürülen dizideki değerleri ekleyin values() . Listeyi geri ver. |
Şimdi bu yöntem kodda çağrılabilir:
kod | Not |
---|---|
|
Değişken list , .__ dosyasının tüm değerlerinin bir listesini saklar Day enum . |