2015-04-22 76 views
0

这里是一些使用get()方法的枚举。Java。在枚举中使用泛型获取特定类型

public class ZooTest { 

    public enum Animals { 

     CHLOE("cat"), 
     MOLLY("dog"), 
     LUNA("cat"), 
     TOBY("dog"), 
     ZOE("parrot"), 
     SNICKERS("cat"); 

     private final String type; 

     Animals(String type) { 
      this.type = type; 
     } 

     public class Animal { 
     } 

     public class Cat extends Animal { 
     } 

     public class Dog extends Animal { 
     } 

     public class Parrot extends Animal { 
     } 

     public Animal get() { 
      return "cat".equals(type) 
        ? new Cat() 
        : "dog".equals(type) 
          ? new Dog() 
          : new Parrot(); 
     } 
    } 

    @Test 
    public void shouldReturnSpecificClass() { 
     assertTrue(Animals.CHLOE.get() instanceof Cat); 
    } 

    @Test(expectedExceptions = {ClassCastException.class}) 
    public void shouldReturnSpecificClass2() { 
     Dog dog = (Dog) Animals.CHLOE.get(); 
    } 
} 

问题是,如何改进以返回特定类型的动物而不使用外部枚举类型投射。当然,我可以使用如下方法:

public <T extends Animal> T get(Class<T> clazz) { return (T) get(); } 

但也许有一些笨拙的方法。

+2

这看起来像一个枚举是不适合的。也许更好的做法是将每个动物作为一个实例,在“动物”类中注明枚举类型?枚举用于不改变的值,这是一种不直观地应用于动物列表的属性。 – Sinkingpoint

+0

并摆脱字符串常量。在这里,似乎你可以使用类对象(比如'Cat.class')。 – Thilo

+2

问题:您打算如何使用此设计来实现? – GhostCat

回答

2

此答案基于假设您实际上不需要单独使用Cat作为CHLOE,LUNA或SNICKERS的实例。另外,由于你的动物没有任何方法或状态,它看起来并不像你真的需要它们作为单独的类。所以也许这样会更容易:

public enum AnimalType { 
    Cat, Dog, Parrot; 
} 

public enum Animals { 

    CHLOE(AnimalType.Cat), 
    MOLLY(AnimalType.Dog), 
    LUNA(AnimalType.Cat), 
    TOBY(AnimalType.Dog), 
    ZOE(AnimalType.Parrot), 
    SNICKERS(AnimalType.Cat); 

    private final AnimalType type; 

    Animals(AnimalType type) { 
     this.type = type; 
    } 

    public AnimalType get() { 
     return type; 
    } 
} 
2

您可以创建一个抽象方法get动物是每个实例必须实现:

public enum Animals { 

     CHLOE("cat") { 
      @Override 
      public Animal get() { return new Cat(); } 
     }, 
     MOLLY("dog") { 
      @Override 
      public Animal get() { return new Dog(); } 
     } 
     //... and so on 

     public abstract Animal get(); 
    } 
+0

不幸的是,即使'CHLOE(“猫”){公猫Cat get(){return new Cat(); }}'不会允许'Cat cat = Animals.CHLOE.get();' – ytterrr

+0

为什么不呢?哪个是错误? –

+0

我的错误是“不兼容的类型:Animals.Animal不能转换为Animals.Cat”。 – ytterrr

0

你必须使用枚举的两个错误。第一个枚举实体必须提供类型不是实例的东西(如何指向Quirliom),然后您的动物枚举必须包含成员猫,狗等。第二个遗憾的是,您不能从枚举扩展任何类。