2009-02-11 12 views
39

Sadece bu hataya sahip Java5 projesini aldım, Java5 ve Java6 kullanmayı denedim, ancak hala var. Bir şekilde daha önce çalıştı (svn'de olduğu için), bu derleyici hatasını nasıl atlayabilirim?Bir başlatıcıdaki statik enum alanına başvuramıyor musunuz?

+0

size çalıştığımız şey – tddmonkey

+0

Eğer küçük bir kod örneği verebilir misiniz erroring oluyor kodunuzu göndermek için yardımcı olabilir başarmak? –

+0

Bunun için üzgünüm, google üzerinden buldum, ancak özel statik final alanı ilkel bir tür olduğunda işe yaradığı görülüyor. Neden olduğu hakkında bir fikri olan var mı? – Norswap

cevap

70

Hatayı "bypass" etme - istediğiniz şeyi yapmaz. Hata iyi bir sebep için var.

Enum değerleri diğer statik alanlardan önce başlatılır. Eğer bir harita içine tüm değerleri ekleme gibi bir şey yapmak istiyorsanız, başka şeyden sonra statik başlatıcısı bunu yapmak:

import java.util.*; 

public enum Foo 
{ 
    BAR, BAZ; 

    private static final Map<String, Foo> lowerCaseMap; 

    static 
    { 
     lowerCaseMap = new HashMap<String, Foo>(); 
     for (Foo foo : EnumSet.allOf(Foo.class)) 
     { 
      // Yes, use some appropriate locale in production code :) 
      lowerCaseMap.put(foo.name().toLowerCase(), foo); 
     } 
    } 
} 
+0

Jon - Bu hatanın Eclipse 3.3'te neden gerçekleşmediğini biliyor musunuz, ancak 3.4'te mi? – tddmonkey

+3

Yukarıdaki örnekte Foo foo: Foo.values ​​() 'yerine Foo foo: EnumSet.allOf (Foo.class)' nin kullanılmasının nedeni var mı? –

+1

@AbdullahJibaly: Pek değil. Sanırım burada oldukça fazla eşdeğer. –

6

bir başka yolu "bypass" o, örneğin bir sayaç gerekiyorsa veya her initalization çalıştırmak için gereken bir şey, bu yüzden gibi özel statik iç sınıf oluşturmaktır: