ส่วนคำสั่ง 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ