ฉันเชื่อว่ามีการใช้รูปแบบบัญญัติที่เกี่ยวข้องสองประการ: แบบฟอร์มและอินสแตนซ์
ที่ยอมรับรูปแบบหมายถึงว่าค่าของประเภทเฉพาะของทรัพยากรที่สามารถอธิบายหรือแสดงในหลายวิธีและหนึ่งในวิธีเหล่านั้นได้รับการแต่งตั้งเป็นรูปแบบที่เป็นที่ยอมรับได้รับการสนับสนุน (รูปแบบนั้นเป็นรูปแบบบัญญัติเช่นเดียวกับหนังสือที่สร้างเป็นพระคัมภีร์และรูปแบบอื่น ๆ ไม่ได้) ตัวอย่างคลาสสิกของรูปแบบบัญญัติคือพา ธ ในระบบไฟล์แบบลำดับชั้นซึ่งไฟล์เดียวสามารถอ้างอิงได้หลายวิธี :
myFile.txt # in current working dir
../conf/myFile.txt # relative to the CWD
/apps/tomcat/conf/myFile.txt # absolute path using symbolic links
/u1/local/apps/tomcat-5.5.1/conf/myFile.txt # absolute path with no symlinks
คำจำกัดความคลาสสิกของการแสดงตามรูปแบบบัญญัติของไฟล์นั้นจะเป็นพา ธ สุดท้าย ด้วยเส้นทางท้องถิ่นหรือสัมพัทธ์คุณไม่สามารถระบุทรัพยากรทั่วโลกโดยไม่มีข้อมูลบริบท ด้วยพา ธ สัมบูรณ์คุณสามารถระบุทรัพยากรได้ แต่ไม่สามารถบอกได้ว่าสองเส้นทางอ้างถึงเอนทิตีเดียวกันหรือไม่ ด้วยเส้นทางสองเส้นทางขึ้นไปที่แปลงเป็นรูปแบบบัญญัติคุณสามารถดำเนินการทั้งหมดข้างต้นรวมทั้งตรวจสอบว่าทรัพยากรสองรายการเหมือนกันหรือไม่หากมีความสำคัญต่อแอปพลิเคชันของคุณ (แก้ปัญหานามแฝง )
โปรดทราบว่ารูปแบบมาตรฐานของทรัพยากรไม่ใช่คุณภาพของรูปแบบนั้นเอง อาจมีรูปแบบบัญญัติที่เป็นไปได้หลายรูปแบบสำหรับประเภทที่กำหนดเช่นเส้นทางไฟล์ (เช่นตามศัพท์เป็นอันดับแรกของพา ธ สัมบูรณ์ที่เป็นไปได้ทั้งหมด) รูปแบบหนึ่งถูกเลือกเป็นเพียงรูปแบบบัญญัติเพื่อเหตุผลในการใช้งานเฉพาะหรืออาจจะโดยพลการเพื่อให้ทุกคนพูดภาษาเดียวกัน
การบังคับให้ออบเจ็กต์เป็นอินสแตนซ์ตามรูปแบบบัญญัติเป็นแนวคิดพื้นฐานเดียวกัน แต่แทนที่จะพิจารณาการแสดงทรัพยากรที่ "ดีที่สุด" อย่างใดอย่างหนึ่งโดยพลการจะเลือกอินสแตนซ์ของคลาสของอินสแตนซ์ที่มี "เนื้อหา" เดียวกับการอ้างอิงตามรูปแบบบัญญัติโดยพลการแล้วแปลงการอ้างอิงทั้งหมด กับวัตถุที่เทียบเท่าเพื่อใช้อินสแตนซ์ Canonical เดียว
ซึ่งสามารถใช้เป็นเทคนิคในการเพิ่มประสิทธิภาพทั้งเวลาและพื้นที่ หากมีหลายอินสแตนซ์ของออบเจ็กต์ที่เทียบเท่ากันในแอปพลิเคชันจากนั้นการบังคับให้พวกเขาทั้งหมดได้รับการแก้ไขเป็นอินสแตนซ์มาตรฐานเดียวของค่าเฉพาะคุณสามารถกำจัดค่าทั้งหมดยกเว้นค่าใดค่าหนึ่งเพื่อประหยัดพื้นที่และอาจใช้เวลาเนื่องจากคุณสามารถเปรียบเทียบได้แล้ว ค่าเหล่านั้นที่มีเอกลักษณ์อ้างอิง (==) ซึ่งตรงข้ามกับความเท่าเทียมกันของวัตถุ ( equals()วิธีการ)
ตัวอย่างคลาสสิกของการเพิ่มประสิทธิภาพด้วยอินสแตนซ์ Canonical คือการยุบสตริงที่มีเนื้อหาเดียวกัน การเรียกString.intern()ใช้สองสตริงที่มีลำดับอักขระเดียวกันจะรับประกันว่าจะส่งคืนอ็อบเจ็กต์สตริงที่เป็นที่ยอมรับเดียวกันสำหรับข้อความนั้น หากคุณส่งสตริงทั้งหมดของคุณผ่าน canonicalizer นั้นคุณจะรู้ว่าสตริงที่เทียบเท่ากันนั้นแท้จริงแล้วการอ้างอิงอ็อบเจ็กต์เหมือนกันนั่นคือนามแฝง
ประเภท enum ใน Java 5.0+ บังคับให้อินสแตนซ์ทั้งหมดของค่า enum เฉพาะใช้อินสแตนซ์ Canonical เดียวกันภายใน VM แม้ว่าค่าจะเป็นอนุกรมและ deserialized ก็ตาม นั่นคือเหตุผลที่คุณสามารถใช้if (day == Days.SUNDAY)กับการไม่ต้องรับโทษใน java ได้หากDaysเป็นประเภท enum การทำเช่นนี้สำหรับชั้นเรียนของคุณเป็นไปได้อย่างแน่นอน แต่ต้องระวัง อ่านEffective Javaโดย Josh Bloch สำหรับรายละเอียดและคำแนะนำ