ฉันเข้าใจว่าคอมไพเลอร์ต้องการให้นิพจน์เป็นที่รู้จักในเวลารวบรวมเพื่อรวบรวมสวิตช์ แต่ทำไม Foo.BA_ ไม่คงที่
ในขณะที่ค่าคงที่จากมุมมองของโค้ดใด ๆ ที่เรียกใช้งานหลังจากที่ฟิลด์ได้รับการเริ่มต้นพวกเขาจะไม่คงที่เวลารวบรวมในแง่ที่จำเป็นโดย JLS; ดู§15.28นิพจน์คงที่สำหรับคุณสมบัติของการแสดงออกคงที่ 1 สิ่งนี้อ้างถึง§4.12.4ตัวแปรสุดท้ายซึ่งกำหนด "ตัวแปรคงที่" ดังนี้:
เราเรียกตัวแปรชนิดดั้งเดิมหรือประเภทสตริงที่สุดท้ายและเริ่มต้นด้วยการแสดงออกคงที่เวลารวบรวม (§15.28) ตัวแปรคงที่ ไม่ว่าตัวแปรนั้นจะเป็นตัวแปรคงที่หรือไม่อาจมีความเกี่ยวข้องกับการกำหนดค่าเริ่มต้นของคลาส (§12.4.1), ความเข้ากันได้ของไบนารี (§13.1, §13.4.9) และการกำหนดที่แน่นอน (§16)
ในตัวอย่างของคุณตัวแปร Foo.BA * ไม่มี initializers และดังนั้นจึงไม่ถือว่าเป็น "ตัวแปรคงที่" การแก้ไขนั้นง่าย เปลี่ยนการประกาศตัวแปร Foo.BA * เพื่อให้มี initializers ที่เป็นนิพจน์ค่าคงที่แบบคอมไพล์เวลา
ในตัวอย่างอื่น ๆ (ซึ่ง initializers เป็นนิพจน์ค่าคงที่เวลาคอมไพล์แล้ว) ประกาศตัวแปรตามที่finalอาจเป็นสิ่งที่จำเป็น
คุณสามารถเปลี่ยนรหัสของคุณเพื่อใช้ค่าคงที่ได้enumมากกว่าintแต่ก็มีข้อ จำกัด ที่แตกต่างกันสองข้อ:
1 - ข้อ จำกัด นิพจน์คงที่สามารถสรุปได้ดังนี้ การแสดงออกอย่างต่อเนื่อง) สามารถใช้รูปแบบดั้งเดิมและStringเพียง b) อนุญาตให้พรรคที่มีตัวอักษร (นอกเหนือจากnull) และตัวแปรคงที่เท่านั้น c) อนุญาตให้มีการแสดงออกอย่างต่อเนื่องอาจ parenthesised เป็น subexpressions ง) ให้ผู้ประกอบการยกเว้นสำหรับผู้ประกอบการที่ได้รับมอบหมาย++, --หรือinstanceofและ e) อนุญาตให้ใช้การพิมพ์แบบStringธรรมดาหรือแบบดั้งเดิมเท่านั้น
newโปรดทราบว่านี้ไม่รวมถึงรูปแบบของวิธีการหรือแลมบ์ดาโทรใด ๆ.class, .lengthหรือการห้อยอาร์เรย์ นอกจากนี้การใช้ค่าอาร์เรย์, enumค่า, ค่าของประเภท wrapper ดั้งเดิมการชกมวยและการเลิกทำกล่องจะไม่รวมอยู่เนื่องจาก a)