อีนัมที่มีฟิลด์และเมธอด
เพิ่มพฤติกรรมให้อีนัม
อีนัมที่มีฟิลด์และเมธอด เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
ชนิดแจกแจงเป็นคลาสที่สมบูรณ์
ชนิดแจกแจงของ Java enum เป็นมากกว่ารายการค่าคงที่อย่างมาก แต่เป็นคลาสจริงที่มีอินสแตนซ์เป็นค่าคงที่เหล่านั้น
นั่นหมายความว่าชนิดแจกแจงสามารถมีฟิลด์ ตัวสร้าง และเมธอดได้เช่นเดียวกับคลาสอื่น ๆ
public class Main {
enum Direction { NORTH, SOUTH, EAST, WEST }
public static void main(String[] args) {
Direction d = Direction.NORTH;
System.out.println(d + " is a " + d.getClass().getSuperclass().getSimpleName());
}
}การเพิ่มฟิลด์
คุณสามารถแนบข้อมูลเข้ากับค่าคงที่แต่ละค่าได้ ให้ประกาศฟิลด์ final และตัวสร้าง จากนั้นส่งค่าในวงเล็บหลังค่าคงที่แต่ละตัว
public class Main {
enum Planet {
EARTH(9.81), MARS(3.71), JUPITER(24.79);
private final double gravity;
Planet(double gravity) { this.gravity = gravity; }
double gravity() { return gravity; }
}
public static void main(String[] args) {
System.out.println("Mars gravity: " + Planet.MARS.gravity());
}
}ตัวสร้างของชนิดแจกแจงเป็นแบบส่วนตัว
ตัวสร้างของชนิดแจกแจงจะเป็นส่วนตัวโดยนัย คุณไม่สามารถเรียกใช้ new กับชนิดแจกแจงได้ JVM จะสร้างค่าคงที่เหล่านี้เพียงครั้งเดียวเมื่อโหลดคลาส
สิ่งนี้รับรองว่าจะมีอินสแตนซ์อยู่ในชุดที่ตายตัวและมีจำนวนจำกัด
public class Main {
enum Coin {
PENNY(1), NICKEL(5), DIME(10), QUARTER(25);
private final int cents;
Coin(int cents) { this.cents = cents; }
int cents() { return cents; }
}
public static void main(String[] args) {
int total = Coin.QUARTER.cents() + Coin.DIME.cents();
System.out.println("Total cents: " + total);
}
}หลายฟิลด์
ค่าคงที่หนึ่งค่ามีข้อมูลได้หลายส่วน ในที่นี้ดาวเคราะห์แต่ละดวงเก็บทั้งมวลและรัศมี
public class Main {
enum Planet {
EARTH(5.976e24, 6.37814e6),
MARS(6.421e23, 3.3972e6);
private final double mass, radius;
Planet(double mass, double radius) { this.mass = mass; this.radius = radius; }
double surfaceGravity() {
final double G = 6.67300E-11;
return G * mass / (radius * radius);
}
}
public static void main(String[] args) {
System.out.printf("Earth g = %.2f%n", Planet.EARTH.surfaceGravity());
}
}เมธอดของอินสแตนซ์
เมธอดของชนิดแจกแจงสามารถคำนวณผลลัพธ์จากฟิลด์ของค่าคงที่นั้นเองได้ เช่นเดียวกับเมธอดของอินสแตนซ์ทั่วไป
public class Main {
enum Size {
SMALL(8), MEDIUM(12), LARGE(16);
private final int ounces;
Size(int ounces) { this.ounces = ounces; }
int ounces() { return ounces; }
double liters() { return ounces * 0.0295735; }
}
public static void main(String[] args) {
System.out.printf("Large = %.2f L%n", Size.LARGE.liters());
}
}ชื่อที่มีมาในตัวและลำดับ
อีนัมทุกตัวจะได้รับ name() (ตัวระบุที่ตรงกันทุกประการ) และ ordinal() (ตำแหน่งที่เริ่มนับจากศูนย์)
ควรเก็บข้อมูลของคุณเองแทนการพึ่งพา ordinal() ซึ่งจะใช้งานไม่ได้หากคุณจัดลำดับค่าคงที่ใหม่
public class Main {
enum Day { MON, TUE, WED }
public static void main(String[] args) {
for (Day d : Day.values()) {
System.out.println(d.name() + " -> ordinal " + d.ordinal());
}
}
}values และ valueOf
คอมไพเลอร์สร้างเมธอดช่วยแบบคงที่สองตัว:
values()จะส่งคืนอาร์เรย์ของค่าคงที่ทั้งหมดvalueOf(String)ค้นหาค่าคงที่ตามชื่อ และจะโยนข้อยกเว้นหากไม่พบ
public class Main {
enum Status { ACTIVE, PAUSED, CLOSED }
public static void main(String[] args) {
System.out.println("count: " + Status.values().length);
Status s = Status.valueOf("PAUSED");
System.out.println("parsed: " + s);
}
}การเขียนทับ toString
คุณสามารถเขียนทับ toString() เพื่อกำหนดป้ายกำกับที่อ่านเข้าใจง่ายขึ้น โดยยังคงใช้ชื่อค่าคงที่ในโค้ดได้
public class Main {
enum Priority {
LOW, MEDIUM, HIGH;
@Override public String toString() {
return name().charAt(0) + name().substring(1).toLowerCase();
}
}
public static void main(String[] args) {
for (Priority p : Priority.values()) System.out.println(p);
}
}อีนัมในคำสั่งสวิตช์
อีนัมทำงานร่วมกับคำสั่งสวิตช์ได้อย่างราบรื่น ด้วยนิพจน์สวิตช์สมัยใหม่ คุณจะได้รับการตรวจสอบความครบถ้วนของทุกกรณีและไม่มีการไหลผ่านไปยังกรณีถัดไปโดยไม่ตั้งใจ
public class Main {
enum Traffic { RED, YELLOW, GREEN }
static String action(Traffic t) {
return switch (t) {
case RED -> "Stop";
case YELLOW -> "Slow down";
case GREEN -> "Go";
};
}
public static void main(String[] args) {
System.out.println(action(Traffic.GREEN));
}
}แมปการค้นหาแบบคงที่
รูปแบบที่พบบ่อยคือแมปแบบคงที่จากฟิลด์ย้อนกลับไปยังค่าคงที่ ซึ่งสร้างขึ้นครั้งเดียวในตัวเริ่มต้นแบบคงที่
import java.util.HashMap;
import java.util.Map;
public class Main {
enum Op {
PLUS("+"), MINUS("-");
private final String symbol;
Op(String symbol) { this.symbol = symbol; }
private static final Map<String, Op> BY_SYMBOL = new HashMap<>();
static { for (Op o : values()) BY_SYMBOL.put(o.symbol, o); }
static Op fromSymbol(String s) { return BY_SYMBOL.get(s); }
}
public static void main(String[] args) {
System.out.println(Op.fromSymbol("-"));
}
}อีนัมใช้อินเทอร์เฟซ
อีนัมสามารถใช้อินเทอร์เฟซได้ ทำให้ค่าคงที่ต่าง ๆ เชื่อมต่อเข้ากับโค้ดทั่วไปได้
public class Main {
interface Describable { String describe(); }
enum Animal implements Describable {
DOG, CAT;
public String describe() { return "A " + name().toLowerCase(); }
}
public static void main(String[] args) {
Describable d = Animal.DOG;
System.out.println(d.describe());
}
}ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับฟิลด์ของอีนัม
ทบทวน
คุณได้เรียนรู้ว่าอีนัมเป็นคลาสที่สมบูรณ์:
- ค่าคงที่สามารถเก็บฟิลด์ที่กำหนดผ่านตัวสร้างส่วนตัวได้
- อีนัมมีเมธอดของอินสแตนซ์และเขียนทับ
toString()ได้ values()และvalueOf()ถูกสร้างให้โดยอัตโนมัติ- อีนัมสามารถใช้อินเทอร์เฟซ และควรเลือกใช้ฟิลด์แทน
ordinal()
ถัดไป พบกับพฤติกรรมเฉพาะค่าคงที่โดยใช้เมธอดนามธรรม
public class Main {
enum Greeting { HELLO; String text() { return "Hi"; } }
public static void main(String[] args) {
System.out.println("Enum fields recap: " + Greeting.HELLO.text());
}
}คำถามที่พบบ่อย
บทเรียน “อีนัมที่มีฟิลด์และเมธอด” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “อีนัมที่มีฟิลด์และเมธอด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “อีนัมที่มีฟิลด์และเมธอด”
เพิ่มพฤติกรรมให้อีนัม คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “อีนัมที่มีฟิลด์และเมธอด” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- อีนัมที่มีฟิลด์และเมธอด
- เมธอดนามธรรมในอีนัม
- EnumSet
- EnumMap