2015-07-03 15 views
5

tüm sigorta kapsamındadır algılamıyor Enum değerleri için olası tüm durumların ele alındığı ifade. Örnekte her durumda geçişten önce başlatılmadı bir değişkeni başlatır, ancak Javac tüm olası durumlar kaplıdır olduğunu tanımadığından derleyici hala bana bir hata veriyor:Java anahtarı ben java bir switch ifadesi içinde bir Enum kullanarak bir sorum var

public class EnumSwitchTest { 

    public enum MyEnum { 
     FOO, 
     BAR 
    } 

    public static void main(String[] args) { 
     test(MyEnum.FOO); 
     test(MyEnum.BAR); 
    } 

    private static void test(MyEnum e) { 
     String msg; 
     switch (e) { 
      case FOO: 
       msg = "foo"; 
       break; 
      case BAR: 
       msg = "bar"; 
       break; 
     } 
     // Why does the compiler think it is possible to reach here 
     // and msg could still be uninitialized? 
     System.out.println("Enum is: " + e + " msg is: " + msg); 
    } 
} 

Neden bir derleyici yeteneğine sahip değildir Bu anahtarın her zaman msg başlatılacağını (veya enull olduğu için bir NullPointerException atar) algılar?

Asılmak istediğim, tüm durumları ele alan, ancak Enum sınıfı gelecekte genişletilirse ancak anahtara yeni bir durum eklenmezse bir derleme hatasıyla sonuçlanacak bir anahtar ifadesidir.

+1

Bazı yansıma büyülerini kullanarak yeni bir enum örnekleri oluşturmak mümkündür. – immibis

+0

@immibis Mümkün olsa bile, derleyici bununla ilgili rahatsızlık duymamalıdır. – biziclop

+2

Çoğu derleyici bunu algılayabilir, ancak Java Dil Özellikleri, derlemeyi iptal etmelerine izin vermez. Bunun yerine, yalnızca [önerilir] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.11) enum değerleri için eksik anahtar durumları hakkında bir uyarı. –

cevap

10

MyEnum'un ayrı bir sınıf olup olmadığını düşünün. Daha sonra MyEnum sınıfını yeniden derlemek ve EnumSwitchTest'u yeniden derlemeden yeni değerler eklemek (böylece herhangi bir hata almamak) mümkün olacaktır.

Başka bir sınıfın yeni değerle test numarasını çağırması mümkün olabilir.

0

Anahtar bildirimi ile çalışan bir çözüm bilmiyorum, ancak tüm enum sabitlerinin ele alındığı derleme zamanında emin olunacak bir ek açıklama işlemcisi sağlayan Enum Mapper project'u kullanabilirsiniz. Sanırım bu, sorduğun aynı sonucu veriyor.

Ayrıca, geriye doğru arama ve parek haritalayıcıları destekler.

İlgili konular