เราจำเป็นต้องแยกแยะค่าคงที่สองด้าน:
- ชื่อสำหรับค่าที่รู้จักในเวลาการพัฒนาซึ่งเราแนะนำเพื่อการบำรุงรักษาที่ดีขึ้นและ
- ค่าที่พร้อมใช้งานสำหรับคอมไพเลอร์
แล้วก็มีประเภทที่สามที่เกี่ยวข้อง: ตัวแปรที่ค่าไม่เปลี่ยนแปลงเช่นชื่อค่า ความแตกต่างระหว่างตัวแปรที่เปลี่ยนไม่ได้เหล่านี้และค่าคงที่คือเมื่อค่าถูกกำหนด / กำหนด / กำหนดค่าเริ่มต้น: ตัวแปรจะเริ่มต้นที่รันไทม์ แต่ค่าของค่าคงที่เป็นที่รู้จักในระหว่างการพัฒนา ความแตกต่างนี้ค่อนข้างยุ่งเหยิงเนื่องจากค่าอาจทราบได้ในระหว่างการพัฒนา แต่จริง ๆ แล้วจะถูกสร้างขึ้นระหว่างการเริ่มต้นเท่านั้น
แต่ถ้าค่าของค่าคงที่เป็นที่รู้จักกันในเวลารวบรวมแล้วคอมไพเลอร์สามารถดำเนินการคำนวณด้วยค่านั้น ยกตัวอย่างเช่นภาษา Java มีแนวคิดของการแสดงออกอย่างต่อเนื่อง การแสดงออกอย่างต่อเนื่องคือการแสดงออกใด ๆ ที่ประกอบด้วยเพียงตัวอักษรของดั้งเดิมหรือสตริงการดำเนินการเกี่ยวกับการแสดงออกอย่างต่อเนื่อง (เช่นการหล่อการเพิ่มสตริงที่ต่อกัน) และตัวแปรคงที่ [ JLS §15.28 ] ตัวแปรคงที่คือfinal
ตัวแปรที่เริ่มต้นได้ด้วยนิพจน์คงที่ [JLS §4.12.4] ดังนั้นสำหรับ Java นี่คือค่าคงที่เวลาคอมไพล์:
public static final int X = 7;
สิ่งนี้กลายเป็นเรื่องที่น่าสนใจเมื่อมีการใช้ตัวแปรคงที่ในหน่วยการคอมไพล์หลายชุด พิจารณา:
ตอนนี้เมื่อเราคอมไพล์ไฟล์เหล่านี้B.class
ไบต์จะประกาศฟิลด์Y = 9
เพราะB.Y
เป็นตัวแปรคงที่
แต่เมื่อเราเปลี่ยนA.X
ตัวแปรเป็นค่าที่แตกต่าง (พูดX = 0
) และคอมไพล์A.java
ไฟล์ใหม่เท่านั้นก็B.Y
ยังคงหมายถึงค่าเก่า สถานะA.X = 0, B.Y = 9
นี้ไม่สอดคล้องกับการประกาศในซอร์สโค้ด การแก้ไขข้อบกพร่องมีความสุข!
นี่ไม่ได้หมายความว่าค่าคงที่ไม่ควรเปลี่ยนแปลง ค่าคงที่นั้นดีกว่าตัวเลขเวทย์มนตร์ที่ปรากฏโดยไม่มีคำอธิบายในซอร์สโค้ด อย่างไรก็ตามค่าของค่าคงที่สาธารณะเป็นส่วนหนึ่งของประชาชน API สิ่งนี้ไม่เฉพาะกับ Java แต่เกิดขึ้นใน C ++ และภาษาอื่น ๆ ที่มีหน่วยการคอมไพล์แยกต่างหาก หากคุณเปลี่ยนค่าเหล่านี้คุณจะต้องคอมไพล์โค้ดที่ต้องพึ่งพาอีกครั้งทั้งหมดเช่นทำการคอมไพล์ใหม่ทั้งหมด
ขึ้นอยู่กับลักษณะของค่าคงที่พวกเขาอาจนำไปสู่ข้อสันนิษฐานที่ไม่ถูกต้องโดยนักพัฒนา หากมีการเปลี่ยนแปลงค่าเหล่านี้พวกเขาอาจก่อให้เกิดข้อผิดพลาด public static final int R = 4, W = 2, X = 1
ตัวอย่างเช่นชุดของค่าคงที่อาจจะได้รับการแต่งตั้งเพื่อให้พวกเขาในรูปแบบรูปแบบบิตบางอย่างเช่น หากสิ่งเหล่านี้เปลี่ยนเป็นรูปแบบโครงสร้างที่แตกต่างกันเช่นR = 0, W = 1, X = 2
นั้นรหัสที่มีอยู่เช่นboolean canRead = perms & R
จะไม่ถูกต้อง และแค่คิดว่าความสนุกที่จะตามมาคือInteger.MAX_VALUE
การเปลี่ยน! ไม่มีการแก้ไขที่นี่เป็นสิ่งสำคัญที่ต้องจำไว้ว่าคุณค่าของค่าคงที่บางอย่างมีความสำคัญและไม่สามารถเปลี่ยนแปลงได้ง่ายๆ
แต่สำหรับค่าคงที่ส่วนใหญ่ที่เปลี่ยนพวกมันจะเป็นไปได้ตราบใดที่มีการพิจารณาข้อ จำกัด ข้างต้น ค่าคงที่ปลอดภัยที่จะเปลี่ยนเมื่อความหมายไม่ใช่ค่าเฉพาะเป็นสิ่งสำคัญ เช่นนี้จะเป็นกรณีสำหรับ tunables เช่นBORDER_WIDTH = 2
หรือTIMEOUT = 60; // seconds
หรือแม่แบบเช่นAPI_ENDPOINT = "https://api.example.com/v2/"
- แม้ว่าเนื้อหาบางส่วนหรือทั้งหมดของผู้ที่ควรจะระบุไว้ในแฟ้มการกำหนดค่ามากกว่ารหัส