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 finalgereken gibi bildirme .
Kodunuzu sabitlerden enumziyade 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 Stringsadece, b) dışında değişmezleri (vardır primerler sağlar nullatama 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 Stringsadece ilkel tiplere izin vermesi .
Not bu yöntem veya lambda çağrıları herhangi bir şekilde içermez, new, .class. .lengthveya dizi aboneliği. Ayrıca, dizi değerlerinin, enumdeğerlerin, ilkel sargı tiplerinin, boksun ve kutunun açılmasının her türlü kullanımı a) nedeniyle hariç tutulmuştur.