Derleyici bir anahtar derlemek için derleme zamanında bilinmesi için ifade ihtiyacı anlıyorum, ama neden Foo.BA_ sabit değil?
Alanlar başlatıldıktan sonra yürütülen herhangi bir kodun perspektifinden sabit olmalarına rağmen , JLS'nin gerektirdiği anlamda bir derleme zaman sabiti değildir ; Sabit bir ifadenin özellikleri için bkz. §15.28 Sabit İfadeler 1 . Bu , aşağıdaki gibi bir "sabit değişken" tanımlayan §4.12.4 Son Değişkenleri ifade eder :
İlkel tür veya String türünde, derleme zamanı sabit ifadesiyle (§15.28) sabit bir değişkenle sonlandırılmış ve başlatılmış bir değişken diyoruz. Bir değişkenin sabit bir değişken olup olmadığı, sınıf başlatma (§12.4.1), ikili uyumluluk (§13.1, §13.4.9) ve kesin ödev (§16) ile ilgili sonuçlar doğurabilir.
Örneğin, Foo.BA * değişkenlerinin başlatıcıları yoktur ve bu nedenle "sabit değişkenler" olarak nitelendirilmezler. Düzeltme basit; Foo.BA * değişken bildirimlerini derleme zamanı sabit ifadeleri olan başlatıcılar olacak şekilde değiştirin.
Diğer örneklerde (başlatıcıların zaten derleme zamanı sabit ifadeleri olduğu durumlarda), değişkeni final
gereken gibi bildirme .
Kodunuzu sabitlerden enum
ziyade kullanmak için değiştirebilirsiniz int
, ancak bu başka birkaç kısıtlama getirir:
1 - Sabit ifade kısıtlamaları aşağıdaki gibi özetlenebilir. Bir sabit ifadeler) ilkel türde kullanabilir ve String
sadece, b) dışında değişmezleri (vardır primerler sağlar null
atama operatörleri dışında operatörleri izin verir) d, sabit ifadeler muhtemelen subexpressions olarak parenthesised izin verir)) ve sabit değişkenler, sadece, c ++
, --
ya da instanceof
, ve e) tip dökümlerinin String
sadece ilkel tiplere izin vermesi .
Not bu yöntem veya lambda çağrıları herhangi bir şekilde içermez, new
, .class
. .length
veya dizi aboneliği. Ayrıca, dizi değerlerinin, enum
değerlerin, ilkel sargı tiplerinin, boksun ve kutunun açılmasının her türlü kullanımı a) nedeniyle hariç tutulmuştur.