ฉันเข้าใจว่าคอมไพเลอร์ต้องการให้นิพจน์เป็นที่รู้จักในเวลารวบรวมเพื่อรวบรวมสวิตช์ แต่ทำไม 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)