Nalika pemrograman, kita asring nemoni kabutuhan kanggo mbatesi set nilai sing bener kanggo jinis data tartamtu. Dadi, contone, dina minggu bisa duwe 7 nilai sing beda-beda, sasi taun bisa duwe 12, lan musim bisa duwe 4. Kanggo ngatasi masalah kasebut, akeh basa pemrograman sing diketik kanthi statis nyedhiyakake jinis data khusus - enumerasi ( Anggota Enum minangka conto
Elemen
enum
). Enumerasi ora langsung katon ing Jawa. Konstruksi basa khusus enum
diwiwiti kanthi versi 1.5. Nganti titik iki, programer wis nggunakake cara liya kanggo ngleksanakake enumerasi.
mbangun enum
Ayo dadi miwiti karo conto. Ayo diterangakeenum
jinis data kanggo nyimpen mangsa nggunakake:
enum Season { WINTER, SPRING, SUMMER, AUTUMN }
Inggih, conto prasaja saka nggunakake:
Season season = Season.SPRING;
if (season == Season.SPRING) season = Season.SUMMER;
System.out.println(season);
Akibaté, SUMMER bakal dicithak ing konsol . Aku sing conto iku ketok lan ora perlu panjelasan.
Enum minangka kelas
Kanthi ngumumakeenum
, kita nggawe kelas sing asale saka java.lang.Enum
. Conventionally, construction enum Season { ... }
padha karo class Season extends java.lang.Enum { ... }
. Lan sanajan kompiler ora ngidini kita menehi warisan kanthi jelas saka java.lang.Enum
kita, nanging isih gampang kanggo verifikasi manawa enum
diwarisake nggunakake reflection
:
System.out.println(Season.class.getSuperclass());
Ing ngisor iki bakal ditampilake ing console:
class java.lang.Enum
Warisan nyata ditindakake kanthi otomatis dening kompiler Jawa. Sabanjure, ayo setuju nelpon kelas sing digawe dening compiler kanggo ngleksanakake enumerasi -class enum
, lan kemungkinan nilai saka jinis enumerated minangka enum
unsur -a.
Anggota Enum minangka conto enum
saka -class sing bisa diakses kanthi statis
Elemen enum Season (WINTER, SPRING и т.д.)
minangka conto sing bisa diakses kanthi statis enum
saka -class Season
. Kasedhiyan statis ngidini kita nindakake perbandingan nggunakake operator pembanding referensi ==
. Tuladha:
Season season = Season.SUMMER;
if (season == Season.AUTUMN) season = Season.WINTER;
Jeneng lan nomer seri saka unsur enum
Kaya kasebut sadurunge, sembarangenum
-class inherits java.lang.Enum
, kang ngandhut sawetara cara migunani kanggo kabeh enumeration. Tuladha:
Season season = Season.WINTER;
System.out.println("season.name()=" + season.name() + " season.toString()=" + season.toString() + " season.ordinal()=" + season.ordinal());
Output bakal:
season.name()=WINTER season.toString()=WINTER season.ordinal()=0
Cara name()
, toString()
lan ditampilake ing kene ordinal()
. Semantik metode kasebut jelas. Perlu dicathet menawa metode kasebut enum
diwarisake saka kelas java.lang.Enum
. Njupuk unsur enum
kanthi perwakilan senar saka jenenge Cukup asring tugas muncul kanggo njupuk unsur enum
kanthi perwakilan senar. Kanggo tujuan kasebut, ing saben enum
kelas, kompiler kanthi otomatis nggawe cara statis khusus: public static EnumClass valueOf(String name)
, sing ngasilake unsur enumerasi EnumClass
kanthi jeneng sing padha karo name
. Tuladha panganggone:
String name = "WINTER";
Season season = Season.valueOf(name);
Minangka asil saka eksekusi kode, variabel mangsa bakal padha karo Season.WINTER
. Elinga yen unsur kasebut ora ditemokake, IllegalArgumentException bakal dibuwang , lan yen name
padha null
, NullPointerException bakal dibuwang . Miturut cara, iki asring dilalekake. Kanggo sawetara alasan, akeh sing yakin yen fungsi njupuk siji argumentasi lan ing kondisi tartamtu mbuwang IllegalArgumentException , banjur nalika ngliwati ana , IllegalArgumentExceptionnull
mesthi bakal dibuwang uga . Nanging iku ing jejere titik. Ayo diterusake. Entuk kabeh unsur enumerasi Kadhangkala sampeyan kudu entuk dhaptar kabeh unsur kelas-kelas nalika mbukak. Kanggo tujuan kasebut, kompiler nggawe metode ing saben kelas . Tuladha panganggone: enum
enum
public static EnumClass[] values()
System.out.println(Arrays.toString(Season.values()));
Kita entuk output ing ngisor iki:
[WINTER, SPRING, SUMMER, AUTUMN]
Elinga yen metode valueOf()
utawa metode ora values()
ditetepake ing kelas java.lang.Enum
. Nanging, padha otomatis ditambahake dening compiler nalika enum
-class nyawiji. Nambahake cara dhewe kanggo enum
-class Sampeyan duwe kesempatan kanggo nambah cara dhewe loro kanggo enum
-class lan unsur sawijining: Padha, nanging karo polymorphism: Conto pungkasan nduduhake nggunakake pusaka ing enum
. Liyane babagan iki mengko. Warisanenum
ing Jawa enum
ngidini sampeyan ngleksanakake hirarki kelas, obyek sing digawe ing siji conto lan bisa diakses kanthi statis. Ing kasus iki, unsur enum
bisa ngemot konstruktor dhewe. Ayo menehi conto: Ing kene kita ngumumake enumerasi Type
kanthi telung unsur INT
, INTEGER
lan STRING
. Compiler bakal nggawe kelas lan obyek ing ngisor iki:
Type
- kelas asalé sakajava.lang.Enum
INT
- obyek saka kelas 1 asalé sakaType
INTEGER
- obyek saka kelas 2 asalé sakaType
STRING
- obyek saka kelas 3 asalé sakaType
Object parse(String)
lan konstruktor Type(..., boolean)
. Ing wektu sing padha, obyek saka kelas INT
, INTEGER
lan STRING
ana ing salinan siji lan statis diakses. Sampeyan bisa verifikasi iki:
System.out.println(Type.class);
System.out.println(Type.INT.getClass() + " " + Type.INT.getClass().getSuperclass());
System.out.println(Type.INTEGER.getClass() + " " + Type.INTEGER.getClass().getSuperclass());
System.out.println(Type.STRING.getClass() + " " + Type.STRING.getClass().getSuperclass());
Kita entuk output ing ngisor iki:
class Type
class Type$1 class Type
class Type$2 class Type
class Type$3 class Type
Bisa dideleng manawa kompiler nggawe kelas Type
lan 3 nested
kelas sing asale saka Type
.
Decompiled enum-kelas karo warisan
Kanggo konfirmasi ing ndhuwur, kita uga nampilake asil dekompilasi enumerasiType
saka conto ing ndhuwur:
Enumerasi lan polimorfisme parametrik
Sing maca bisa uga mikir: " Napa enumerasi Tipe ing ndhuwur ora nggunakake generik? " Kasunyatane yen ing Jawa ora nggunakake generikenum
. Dadi conto ing ngisor iki ora bakal dikompilasi:
enum Type<T> {}
Sinau luwih
Kanggo mangerteni sing luwih jero babagan cara enumerasi ing Jawa, aku nyaranake sampeyan familiarize dhewe karo kode sumber kelasjava.lang.Enum
, lan uga nggunakake decompiler Jad kanggo sinau kode sing digawe. Menapa malih, sinau kode sumber perpustakaan Jawa pancen perlu kanggo mangerteni carane akeh mekanisme ing Jawa dianggo lan migunani minangka referensi kanggo desain obyek-oriented. Pranala menyang sumber asli: http://alexander.lds.lg.ua/
GO TO FULL VERSION