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

ส่วนคำสั่ง permits

ระบุชนิดย่อยที่อนุญาต

ส่วนคำสั่ง permits เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

ส่วนคำสั่งกำหนดชนิดที่อนุญาต

ส่วนคำสั่ง permits ใช้สำหรับให้ชนิดแบบปิดระบุชื่อชนิดย่อยที่อนุญาต โดยจะอยู่ถัดจากชื่อชนิดและคีย์เวิร์ด permits โดยตรง

ไวยากรณ์พื้นฐาน

แสดงรายการชนิดย่อยที่อนุญาตโดยคั่นด้วยจุลภาคหลัง permits

public class Main {
    sealed interface Vehicle permits Car, Truck, Motorcycle {}
    record Car() implements Vehicle {}
    record Truck() implements Vehicle {}
    record Motorcycle() implements Vehicle {}

    public static void main(String[] args) {
        Vehicle v = new Truck();
        System.out.println(v.getClass().getSimpleName());
    }
}

การทำตามสัญญา

ชนิดย่อยที่ระบุชื่อไว้แต่ละชนิดต้อง implements (สำหรับอินเทอร์เฟซ) หรือ extends (สำหรับคลาส) ชนิดแบบปิดนั้นจริง ๆ การระบุชื่อคลาสใน permits แต่คลาสนั้นไม่ได้ทำตาม จะทำให้เกิดข้อผิดพลาดในการคอมไพล์

การละเว้นการกำหนดชนิดที่อนุญาต

หากชนิดย่อยที่ได้รับอนุญาตทั้งหมดประกาศอยู่ใน ไฟล์เดียวกัน กับชนิดแบบปิด คุณสามารถละเว้น permits ได้ทั้งหมด คอมไพเลอร์จะอนุมานรายการให้โดยอัตโนมัติ

public class Main {
    sealed interface Status {}
    record Active() implements Status {}
    record Inactive() implements Status {}

    public static void main(String[] args) {
        Status s = new Active();
        System.out.println(s.getClass().getSimpleName());
    }
}

เมื่อจำเป็นต้องกำหนดชนิดที่อนุญาต

หากชนิดย่อยอยู่ใน ไฟล์แยกกัน ภายในแพ็กเกจหรือโมดูลเดียวกัน คุณต้องแสดงรายการชนิดเหล่านั้นอย่างชัดเจนใน permits คอมไพเลอร์ไม่สามารถอนุมานรายการข้ามไฟล์ได้

ลำดับไม่มีผล

ลำดับของชื่อใน permits ไม่มีความหมายเชิงการทำงาน ไม่ส่งผลต่อการทำงานของคำสั่งสวิตช์หรือสิ่งอื่นใด แต่เป็นเพียงรายการชนิดที่อนุญาตเท่านั้น

ลำดับชั้นคลาสที่ใช้การกำหนดชนิดที่อนุญาต

ส่วนคำสั่งเดียวกันนี้ใช้กับคลาสแบบปิดที่มีพฤติกรรมแบบนามธรรมได้

public class Main {
    sealed static abstract class Node permits Leaf, Branch {
        abstract int size();
    }
    static final class Leaf extends Node {
        int size() { return 1; }
    }
    static final class Branch extends Node {
        final Node a, b;
        Branch(Node a, Node b) { this.a = a; this.b = b; }
        int size() { return a.size() + b.size(); }
    }

    public static void main(String[] args) {
        Node tree = new Branch(new Leaf(), new Branch(new Leaf(), new Leaf()));
        System.out.println("Leaves: " + tree.size());
    }
}

การลืมระบุชนิดย่อย

หากคลาสนำอินเทอร์เฟซแบบปิดไปใช้แต่ไม่มีชื่ออยู่ใน permits การคอมไพล์จะล้มเหลวพร้อมข้อความที่ระบุว่าคลาสนั้นไม่ได้รับอนุญาตให้สืบทอดจากชนิดแบบปิด

ชนิดที่อนุญาตเป็นข้อมูลที่เปิดเผย

รายการ permits เป็นส่วนหนึ่งของสัญญาของชนิดและถูกบันทึกไว้ในไฟล์คลาส เครื่องมือและคอมไพเลอร์จึงสามารถอ่านรายการนี้เพื่อทราบชุดชนิดย่อยทั้งหมดได้

การผสมชนิดย่อยแบบปิดท้ายและแบบปิด

รายการ permits สามารถผสมตัวปรับแต่งได้ ชนิดย่อยบางชนิดอาจเป็น final ส่วนชนิดอื่นอาจเป็น sealed เพื่อสานต่อลำดับชั้นให้ลึกลงไป

public class Main {
    sealed interface Shape permits Circle, Polygon {}
    record Circle(double r) implements Shape {}
    sealed interface Polygon extends Shape permits Triangle, Rectangle {}
    record Triangle() implements Polygon {}
    record Rectangle() implements Polygon {}

    public static void main(String[] args) {
        Shape s = new Triangle();
        System.out.println(s instanceof Polygon);
    }
}

แนวปฏิบัติที่ดี

วางชนิดแบบปิดและชนิดย่อยไว้ใกล้กันเพื่อให้อ่านง่าย ควรละเว้น permits สำหรับลำดับชั้นขนาดเล็กที่อยู่ในไฟล์เดียว และระบุรายการอย่างชัดเจนเมื่อแยกเป็นหลายไฟล์

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเรื่องส่วนคำสั่งกำหนดชนิดที่อนุญาตของคุณ

ทบทวน

คุณได้เรียนรู้ส่วนคำสั่ง permits

  • ส่วนคำสั่งนี้จะแสดงรายการชนิดย่อยที่อนุญาตหลังชื่อชนิดแบบปิด
  • ชนิดที่ระบุไว้แต่ละชนิดต้องสืบทอดหรือนำชนิดแบบปิดไปใช้
  • สามารถละเว้นได้เมื่อชนิดย่อยทั้งหมดอยู่ในไฟล์เดียวกัน
  • ชนิดย่อยเองสามารถเป็นชนิดแบบปิดเพื่อขยายลำดับชั้นต่อได้

คำถามที่พบบ่อย

บทเรียน “ส่วนคำสั่ง permits” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ส่วนคำสั่ง permits” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ส่วนคำสั่ง permits”

ระบุชนิดย่อยที่อนุญาต คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “ส่วนคำสั่ง permits” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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