0Pricing
Java Academy · บทเรียน

ชนิดแบบปิดผนึกกับเรคคอร์ด

จำลองลำดับชั้นแบบปิด

ชนิดแบบปิดผนึกกับเรคคอร์ด เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การประกาศชนิดแบบปิดผนึก
  2. ส่วนคำสั่ง permits
  3. ชนิดแบบปิดผนึกกับเรคคอร์ด
  4. switch แบบครบถ้วนบนชนิดแบบปิดผนึก
← กลับไปที่ Java Academy