1.ความเป็นมาenum
ความเป็นมา
วันนี้เราจะสำรวจประเภทข้อมูลอื่นใน Java enum
: ชื่อนี้enum
มาจากคำว่าแจงนับ ประเภทข้อมูลนี้คืออะไรและมีไว้เพื่ออะไร
บางครั้งโปรแกรมเมอร์จำเป็นต้องสร้างชนิดข้อมูลใหม่ ซึ่งค่าที่เป็นไปได้จะถูกจำกัดไว้ที่รายการคงที่ขนาดเล็ก
ตัวอย่างเช่นDayOfTheWeek
ประเภทสามารถรับค่าMONDAY
, TUESDAY
, WEDNESDAY
, ... มีทั้งหมด 7 ค่า หรือMonth
แบบเอาเฉพาะค่าJANUARY
, FEBRUARY
, MARCH
, ... มีทั้งหมด 12 ค่า
แน่นอน คุณใช้ตัวเลข can ( int
ประเภท): 1
— Monday, 2
— Tuesday เป็นต้น แต่อาจมีคนกำหนดค่าที่ไม่ถูกต้อง เช่น8
หรือ0
ให้กับตัวแปรของคุณ โดยไม่ตั้งใจ
คุณอาจมีสถานการณ์ง่ายๆ ที่โปรแกรมเมอร์คนหนึ่งคิดว่าวันในสัปดาห์ (หรือเดือนต่างๆ ของปี) จะถูกนับโดยเริ่มจากศูนย์ ในขณะที่คนอื่นๆ คาดหวังว่าการนับจะเริ่มจากเลขหนึ่ง เป็นต้น
นั่นเป็นเหตุผลที่เปิดตัว Java enum
ซึ่งเป็นชนิดข้อมูลที่ประกอบด้วยชุดของค่าที่จำกัด
2. การประกาศประเภท
การประกาศประเภทข้อมูลใหม่enum
มีลักษณะดังนี้:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
ชื่อของประเภทใหม่ (คลาส) อยู่ที่ไหนTypeName
และค่าที่เป็นไปได้จะถูกคั่นด้วยเครื่องหมายจุลภาคและอยู่ในวงเล็บปีกกา: Value1
, Value2
,Value3
ตัวอย่างเช่น ลองสร้างของเราเองDayOfTheWeek
enum
:
รหัส | บันทึก |
---|---|
|
Day แบบใหม่จันทร์ อังคาร พุธ พฤหัสบดี ศุกร์ เสาร์ อาทิตย์ |
นี่คือวิธีที่คุณกำหนดค่าให้กับตัวแปรประเภทใหม่ของเรา:
Day day = Day.MONDAY;
ตัวอย่าง:
รหัส | บันทึก |
---|---|
|
เอาต์พุตหน้าจอจะเป็น:
|
3. วิธีการของenum
ประเภทenum
มีวิธีการในตัวหลายวิธี ซึ่งสองวิธีที่น่าสนใจมาก:
เมธอด สแตติกvalues()
ส่งคืนอาร์เรย์ของค่าทั้งหมดของenum
ประเภท:
รหัส | บันทึก |
---|---|
|
ตัวแปรdays เก็บอาร์เรย์ที่มีค่าประเภทDay (7 องค์ประกอบ) แสดงเนื้อหาของอาร์เรย์บนหน้าจอ:
|
เมธอดordinal()
จะส่งกลับเลขลำดับของค่าคงที่ คุณเรียกมันว่าenum
ค่ามากกว่าenum
คลาส:
รหัส | เอาต์พุตคอนโซล |
---|---|
|
|
4. แปลงเป็นชั้นเรียน
ในความเป็นจริง ไม่มีอะไรวิเศษที่นี่ คอมไพเลอร์เพิ่งให้น้ำตาลวากยสัมพันธ์แก่เรา ในเวลารวบรวมDay
enum จะถูกแปลงเป็นคลาสธรรมดา:
รหัสรุ่นง่าย | บันทึก |
---|---|
|
Day class รายการของค่าคงที่คงที่ อาร์เรย์ที่มีค่าทั้งหมดของ Day enum ตัวแปรที่เก็บค่าของ Day วัตถุ เฉพาะ คลาส เป็นแบบส่วนตัว ซึ่งหมายความว่าวัตถุของคลาสสามารถสร้างได้ภายในคลาส เท่านั้น ต้องเรียกใช้เมธอด บนวัตถุ โดยจะส่งคืนค่าของวัตถุ — เขตข้อมูล เมธอดส่งกลับอาร์เรย์แบบคงที่พร้อมค่าทั้งหมดของคลาสDay constructor Day Day ordinal Day value Day |
หากเราลบเมธอดและตัวแปรสแตติกทั้งหมดออกจากDay
คลาส เราจะได้สิ่งต่อไปนี้:
รหัส | บันทึก |
---|---|
|
ตัวแปร value เก็บค่าของDay วัตถุ วัตถุDay สามารถสร้างได้ภายในDay คลาสเท่านั้น เนื่องจากตัวสร้างprivate คือ วิธี ordinal() การส่งกลับvalue ของDay วัตถุ |
กล่าวอีกนัยหนึ่งไม่มีอะไรน่ากลัวเกิดขึ้นที่นี่ คอมไพลเลอร์สร้าง คลาส เพิ่มค่าคง ที่Day
ที่แสดงenum
ค่า เพิ่มเมธอดที่จำเป็น และสร้างคลาสคอนสตรัคเตอร์ private
เราจะดูว่าตัวสร้างทำงานอย่างไรในภายหลัง
หวังว่าตอนนี้คงจะชัดเจนแล้วว่าทำไมเราจึงกำหนดค่าให้กับตัวแปรด้วยวิธีนี้:
Day day = Day.MONDAY;
MONDAY
เป็นเพียงเขตข้อมูลคงที่ (คงที่) ในDay
ชั้นเรียน เมื่อเข้าถึงเมธอดและฟิลด์สแตติกจากภายนอกคลาส คุณต้องระบุชื่อคลาสก่อนชื่อฟิลด์หรือเมธอด
5. วิธีการเพิ่มเติมของenum
ทุกenum
ชั้นเรียนมีคุณสมบัติที่น่าสนใจหลายประการ
การแปลงเป็นและจากสตริง
ในการแปลงออบเจกต์ enum เป็นสตริง คุณต้องเรียกtoString()
เมธอด ของมัน
String str = Day.MONDAY.toString();
หากต้องการแปลงในทิศทางอื่น (จากสตริงเป็นDay
วัตถุ) คุณสามารถใช้valueOf()
วิธีคงที่:
Day day = Day.valueOf("MONDAY");
สะดวกมากและจะเป็นประโยชน์ในหลายกรณี
การแปลงเป็นตัวเลขและย้อนกลับอีกครั้ง
คุณรู้วิธีแปลงenum
วัตถุเป็นตัวเลขแล้ว: เรียกordinal()
เมธอด:
int index = Day.MONDAY.ordinal();
ในการแปลงในทิศทางอื่น (จากตัวเลขเป็นDay
วัตถุ) คุณต้องมีโครงสร้างที่โปร่งใสมากขึ้น:
Day day = Day.values()[2];
ตัวอย่าง:
รหัส | บันทึก |
---|---|
|
วันจันทร์ รับดัชนีของวันจันทร์: 0 วันในสัปดาห์ 2 วันหลังจากวันจันทร์ |
จุดสำคัญ:เนื่องจากenum
ค่าเป็นชุดของค่าคงที่คงที่จึงสามารถเปรียบเทียบได้โดยใช้ == กล่าวอีกนัยหนึ่ง คุณไม่สามารถมีMONDAY
วัตถุสองชิ้นที่เหมือนกันซึ่งมีที่อยู่ต่างกันได้ มีเพียงอินสแตนซ์เดียวของแต่ละค่า enum เท่านั้น และนั่นหมายความว่าการเปรียบเทียบตัวแปร enum โดยใช้ == จะใช้งานได้เสมอ
6. เพิ่มวิธีการของคุณเองในenum
เนื่องจาก an enum
เปลี่ยนเป็นคลาสธรรมดาในเวลาคอมไพล์ คุณสามารถประกาศเมธอดในคลาสนั้นได้ เมธอดเหล่านี้ถูกเพิ่มเข้าไปในคลาสที่คอมไพเลอร์สร้างขึ้น ตัวอย่างเช่น สมมติว่าเราต้องการDay enum
ส่งคืนรายการค่า enum แทนที่จะเป็นอาร์เรย์
จากนั้นเราสามารถเพิ่มรหัสต่อไปนี้:
รหัส | บันทึก |
---|---|
|
ต้องระบุเครื่องหมายอัฒภาคหลังรายการค่า สร้าง ArrayList วัตถุเพิ่มค่าในอาร์เรย์ที่ส่งคืนโดย values() เมธอด ส่งคืนรายการ |
ตอนนี้วิธีนี้สามารถเรียกใช้ในรหัส:
รหัส | บันทึก |
---|---|
|
ตัวแปรlist จะเก็บรายการค่าทั้งหมดDay enum ของ |
GO TO FULL VERSION