ชนิดแบบปิดผนึกกับเรคคอร์ด
จำลองลำดับชั้นแบบปิด
ชนิดแบบปิดผนึกกับเรคคอร์ด เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
ชนิดแบบปิดร่วมกับเรคคอร์ด
อินเทอร์เฟซแบบปิดและ เรคคอร์ด เป็นคู่ที่เหมาะสมอย่างยิ่ง อินเทอร์เฟซแบบปิดกำหนดชุดกรณีที่ปิด ส่วนเรคคอร์ดแต่ละรายการจะเป็นกรณีรูปธรรมที่ไม่เปลี่ยนแปลงได้ เมื่อนำมารวมกัน ทั้งสองอย่างจะใช้สร้างแบบจำลองชนิดข้อมูลพีชคณิตได้
เรคคอร์ดเป็นชนิดปิดการสืบทอดโดยปริยาย
เรคคอร์ดจะเป็น final โดยอัตโนมัติ จึงเป็นไปตามกฎที่ว่าชนิดย่อยที่ได้รับอนุญาตต้องเป็น final, sealed หรือ non-sealed ไม่จำเป็นต้องใช้ตัวปรับแต่งเพิ่มเติม
ลำดับชั้นรูปร่างแบบปิด
สร้างแบบจำลองรูปร่างเป็นเรคคอร์ดที่นำอินเทอร์เฟซแบบปิดไปใช้ โดยแต่ละเรคคอร์ดจะเก็บข้อมูลของตนเอง
public class Main {
sealed interface Shape permits Circle, Rectangle {}
record Circle(double radius) implements Shape {}
record Rectangle(double width, double height) implements Shape {}
public static void main(String[] args) {
Shape s = new Rectangle(3, 4);
System.out.println(s);
}
}การเพิ่มพฤติกรรม
อินเทอร์เฟซแบบปิดสามารถประกาศเมธอดที่เรคคอร์ดทุกชนิดนำไปใช้ได้ ทำให้เกิดพหุรูปแบบเหนือชุดชนิดที่ปิด
public class Main {
sealed interface Shape permits Circle, Rectangle {
double area();
}
record Circle(double radius) implements Shape {
public double area() { return Math.PI * radius * radius; }
}
record Rectangle(double width, double height) implements Shape {
public double area() { return width * height; }
}
public static void main(String[] args) {
Shape s = new Circle(2);
System.out.printf("Area: %.2f%n", s.area());
}
}การเท่ากันและ toString ที่มีให้โดยอัตโนมัติ
เรคคอร์ดจะสร้าง equals, hashCode และ toString ให้โดยอัตโนมัติ เรคคอร์ดสองรายการที่มีองค์ประกอบเหมือนกันจะถือว่าเท่ากัน จึงเหมาะอย่างยิ่งสำหรับการสร้างแบบจำลองค่า
public class Main {
sealed interface Shape permits Circle {}
record Circle(double radius) implements Shape {}
public static void main(String[] args) {
Circle a = new Circle(5);
Circle b = new Circle(5);
System.out.println(a.equals(b));
System.out.println(a);
}
}การสร้างแบบจำลองผลลัพธ์
รูปแบบที่ใช้กันทั่วไปคือชนิดผลลัพธ์แบบปิดที่มีเรคคอร์ดสำหรับความสำเร็จและเรคคอร์ดสำหรับความล้มเหลว เพื่อแทนการคืนค่าเว้นว่างหรือข้อยกเว้นสำหรับผลลัพธ์ที่คาดหมายได้
public class Main {
sealed interface Result permits Ok, Err {}
record Ok(int value) implements Result {}
record Err(String message) implements Result {}
static Result parse(String s) {
try { return new Ok(Integer.parseInt(s)); }
catch (NumberFormatException e) { return new Err("bad number: " + s); }
}
public static void main(String[] args) {
System.out.println(parse("42"));
System.out.println(parse("oops"));
}
}ตัวสร้างแบบกระชับสำหรับการตรวจสอบความถูกต้อง
เรคคอร์ดสามารถตรวจสอบข้อมูลนำเข้าในตัวสร้างแบบกระชับได้ ทำให้แต่ละกรณีถูกต้องตั้งแต่ขั้นตอนการสร้าง
public class Main {
sealed interface Shape permits Circle {}
record Circle(double radius) implements Shape {
Circle {
if (radius < 0) throw new IllegalArgumentException("radius must be >= 0");
}
}
public static void main(String[] args) {
try { new Circle(-1); }
catch (IllegalArgumentException e) { System.out.println(e.getMessage()); }
}
}แบบจำลองข้อมูลแบบเวียนเกิด
เนื่องจากเรคคอร์ดสามารถอ้างอิงอินเทอร์เฟซแบบปิดได้ คุณจึงสร้างโครงสร้างแบบเวียนเกิด เช่น ต้นไม้นิพจน์หรือรายการเชื่อมโยงได้
public class Main {
sealed interface Expr permits Num, Add {}
record Num(int value) implements Expr {}
record Add(Expr left, Expr right) implements Expr {}
public static void main(String[] args) {
Expr e = new Add(new Num(1), new Add(new Num(2), new Num(3)));
System.out.println(e);
}
}ประโยชน์ของการไม่เปลี่ยนแปลง
เรคคอร์ดไม่สามารถเปลี่ยนแปลงได้ในระดับตื้น ดังนั้นลำดับชั้นของเรคคอร์ดแบบปิดจึงทำความเข้าใจได้ง่าย ปลอดภัยต่อการใช้ร่วมกัน และเหมาะกับการทำงานพร้อมกัน ไม่จำเป็นต้องคัดลอกเรคคอร์ดเพื่อป้องกันการเปลี่ยนแปลง
การใช้ร่วมกับคำสั่งสวิตช์
เรคคอร์ดแบบปิดทำงานได้ดีร่วมกับ switch ที่จับคู่รูปแบบ แต่ละกรณีสามารถแยกองค์ประกอบของเรคคอร์ดได้ และคอมไพเลอร์จะตรวจสอบว่าครอบคลุมทุกกรณี ซึ่งจะอธิบายในหลักสูตรเรื่องรูปแบบ
การคำนวณจากแบบจำลอง
คุณสามารถเขียนตัวแปลคำสั่งเป็นเมธอดที่เดินสำรวจต้นไม้เรคคอร์ดแบบเวียนเกิดได้
public class Main {
sealed interface Expr permits Num, Add {}
record Num(int value) implements Expr {}
record Add(Expr left, Expr right) implements Expr {}
static int eval(Expr e) {
if (e instanceof Num n) return n.value();
Add a = (Add) e;
return eval(a.left()) + eval(a.right());
}
public static void main(String[] args) {
Expr e = new Add(new Num(4), new Add(new Num(5), new Num(6)));
System.out.println(eval(e));
}
}ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเรื่องเรคคอร์ดแบบปิดของคุณ
ทบทวน
คุณได้เรียนรู้การใช้ชนิดแบบปิดร่วมกับเรคคอร์ด
- เรคคอร์ดเป็นชนิดปิดการสืบทอดโดยปริยาย จึงนำมาใช้เป็นชนิดย่อยที่ได้รับอนุญาตได้
- อินเทอร์เฟซแบบปิดสามารถประกาศเมธอดที่ใช้ร่วมกันได้
- เรคคอร์ดมีการตรวจสอบความเท่ากัน การแฮช และ toString ให้โดยอัตโนมัติ
- เมื่อนำมารวมกัน ทั้งสองอย่างจะใช้สร้างแบบจำลองข้อมูลที่ปิด ไม่เปลี่ยนแปลง และอาจเป็นแบบเวียนเกิดได้
คำถามที่พบบ่อย
บทเรียน “ชนิดแบบปิดผนึกกับเรคคอร์ด” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ชนิดแบบปิดผนึกกับเรคคอร์ด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ชนิดแบบปิดผนึกกับเรคคอร์ด”
จำลองลำดับชั้นแบบปิด คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “ชนิดแบบปิดผนึกกับเรคคอร์ด” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การประกาศชนิดแบบปิดผนึก
- ส่วนคำสั่ง permits
- ชนิดแบบปิดผนึกกับเรคคอร์ด
- switch แบบครบถ้วนบนชนิดแบบปิดผนึก