1. Nasıl enumoluş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 , , , ... DayOfTheWeekdeğerlerini alabilir. Toplamda 7 değer vardır. Veya bir tür sadece , , , ... değerlerini alabilir. Toplamda 12 değer vardır.MONDAYTUESDAYWEDNESDAYMonthJANUARYFEBRUARYMARCH

Elbette, şu sayıları kullanabilirsiniz ( inttür): 1— Pazartesi, — Salı, vb. Ancak birisi yanlışlıkla veya gibi değişkeninize 2geçersiz değerler atayabilir .80

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
}

TypeNameYeni 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
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY
}
Yeni Daytip

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
Day day = Day.FRIDAY;
System.out.println(day);
Ekran çıktısı şöyle olacaktır:
FRIDAY


3. Yöntemlerenum

Bir enumtü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
Day[] days = Day.values();

for (Day day: days)
   System.out.println(day);







System.out.println(days[2]);
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:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

Yöntem ordinal(), sabitin sıra sayısını döndürür. enumBunu bir sınıf yerine bir değer olarak adlandırırsınız enum:

kod Konsol çıkışı
System.out.println(Day.MONDAY.ordinal());
System.out.println(Day.FRIDAY.ordinal());
System.out.println(Day.SUNDAY.ordinal());
0
4
6


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, Dayenum sıradan bir sınıfa dönüştürülür:

Kod, basitleştirilmiş sürüm Not
public class Day
{
   public static final Day MONDAY = new Day(0);
   public static final Day TUESDAY = new Day(1);
   public static final Day WEDNESDAY = new Day(2);
   public static final Day THURSDAY = new Day(3);
   public static final Day FRIDAY = new Day(4);
   public static final Day SATURDAY = new Day(5);
   public static final Day SUNDAY = new Day(6);

    private static final Day[] array = {MONDAY, TUESDAY,
      WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};

   private final int value;

   private Day (int value)
   {
      this.value = value;
   }

   public int ordinal()
   {
      return this.value;
   }

   public static Day[] values()
   {
      return array;
   }
}
Dayclass

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

DayconstructorDayDay



ordinalDay

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
public class Day
{
  private int value;

  private Day (int value)
  {
    this.value = value;
  }

  public int ordinal()
  {
    return this.value;
  }
}


Değişken , nesnenin valuedeğ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

DayDayprivate




ordinal()valueDay

Başka bir deyişle, burada korkutucu bir şey olmuyor. Derleyici Daysı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;

MONDAYsı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 enumsı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

enumBir 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 Daynesneye), daha şeffaf bir yapıya ihtiyacınız vardır:

Day day = Day.values()[2];

Örnekler:

kod Not
Day day = Day.MONDAY;
int index = day.ordinal();
Day newDay = Day.values()[index+2];
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 . MONDAYBaş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 enumbir dizi yerine enum değerlerinin bir listesini döndürmemizi istediğimizi varsayalım.

Ardından aşağıdaki kodu ekleyebiliriz:

kod Not
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY;

   public static List<Day> asList()
   {
      ArrayList<Day> list = new ArrayList<Day>();

      Collections.addAll(list, values());

      return list;
   }

}








Değerler listesinden sonra noktalı virgül gerekir.



Bir ArrayListnesne 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
List<Day> list = Day.asList();
Değişken list, .__ dosyasının tüm değerlerinin bir listesini saklar Day enum.