2016-04-12 26 views
0

ben yapmak istiyorum neDöküm nesneleri

public enum MyEnum { 
     member1(MyClass1.class){ 
      @Override 
      public void doStuff(Object obj) { 
       ... 
      } 
     }, 
     member2(MyClass2.class){ 
      @Override 
      public void doStuff(Object obj) { 
       ... 
      } 
     }; 
     ... 
     public abstract void doStuff(Object obj); 
    } 

böyle enum yöntemini çağırın olan enum bu tür var itiraz etmek için itiraz eden enum. Geçtiğimde myObject'in MyClass1 olduğunu söyleyelim. Üye1 otomatik olarak, yalnızca enum üye açıklamasında tanımlanmış olan MyClass1'i beklediğini bilmelidir.

bile mümkündür ya da ben tamamen yanlış yolu yürüyorum Böyle bir şey var mı? benzer

+3

yanlış yolu. Afedersiniz. Bu sen ... –

cevap

3
public enum MyEnum { 
    member1(String.class){ 
     @Override 
     public void doStuff(Object obj) { 
     this.checkArgumentType(obj); 
     String stringObj = (String) obj; 
     //... 
     } 
    }, 
    member2(Integer.class){ 
     @Override 
     public void doStuff(Object obj) { 
     this.checkArgumentType(obj); 
     Integer stringObj = (Integer) obj; 
     //... 
     } 

    }; 

    private final Class<?> clazz; 

    MyEnum(Class<?> clazz) { 
     this.clazz = clazz; 
    } 

    void checkArgumentType(Object obj) { 
     if (!clazz.isAssignableFrom(obj.getClass())) { 
     throw new IllegalArgumentException("Wrong class"); 
     } 
    } 

    //... 
    public abstract void doStuff(Object obj); 
} 
+0

Bunu beğendim. Teşekkür ederim! Saniye cevabı da ilginçti, ama gerçekten gerçekten çok hızlı bir şekilde deliriyor. – Kaspar

+1

Bunun güvenli olmadığını unutmayın. Yanlış nesne türünü ilettiğinizde derleme zamanında bir hata almazsınız - bunun yerine çalışma zamanında bir istisna alırsınız. Genelde, çalışma zamanında yerine derleme zamanında hataları yakalamak daha iyidir. – Jesper

+0

Eh, bu ** tip güvenlidir. Sadece derleme zamanı tipi güvenli değil. – Vampire

2

şey mümkündür, ancak bu ayrı sınıflar oluşturarak düşünmesi gereken noktaya kadar, hızlı gerçek dağınık ve karmaşık olur. Ama bir örnek olarak, ne yapabilirdi: Bu akılda buna sahip şekilde bir enum ile mümkün değildir

public enum Foo { 

    member1(new Bar<String, Long>(Long.class){ 

     @Override 
     void doStuff(String aString) { 

     } 

    }); 

    private final Bar<?,?> bar; 

    private Foo(Bar<?,?> bar) { 
     this.bar = bar; 
    } 

    private static abstract class Bar<A,B> { 

     private final Class<B> type; 

     Bar(Class<B> type) { 
      this.type = type; 
     } 

     abstract void doStuff(A a); 
    } 
} 
+0

Güzel çözüm bunu yapmaya çalışıyoruz değil, nasıl yapmaya çalışıyorsun ne olduğunu açıklamak gibi başından başlayın arkadan gerçekten biraz olsa göz göğsüne. : -D – Vampire

0

.

İdeal derleme zamanı tür güvenliği olmasını istiyorum. Object geçişi ve ardından döküm güvenli değildir; hiçbir şey nesnenin bir yanlış tür geçişini engeller ve bir ClassCastException alınca o değil şeye nesne artığını çalıştığınızda, çalışma zamanı kadar bilmez.

Numaralamalar tip parametreleri olamaz, bu nedenle böyle yazın parametrelerle şey yapamaz:

: Tür-güvenliğini istiyorsanız

// This is not valid Java! 
public enum MyEnum<T> { 
    member1<MyClass> { 
     @Override 
     public void doStuff(MyClass obj) { ... } 
    } 

    // ... 
    public abstract void doStuff(T obj); 
} 

, sadece yerine bir enum sabitleri bir demet kullanmak Tamamen

interface MyConstant<T> { 
    void doStuff(T obj); 
} 

public final class MyConstants { 

    public static final MyConstant<MyClass1> MEMBER_1 = new MyConstant<MyClass1>() { 
     @Override 
     public void doStuff(MyClass1 obj) { 
      // ... 
     } 
    }; 

    // etc. 

    private MyConstants() { 
    } 
}