2013-12-23 40 views
2

我想强制Java中的枚举实现,但我发现我做不到。 所以我决定定义一个抽象函数来返回子类的枚举。但不知道该怎么做。如何从Java自己的类中返回类的枚举?

下面是代码:

EnumInterface

public interface EnumInterface 
{ 
    public String getString(); 
} 

父类

public abstract class ParentClass { 
    public abstract Enum<?> getEnums(); 
} 

ChildClass

public class ChildClass extends ParentClass{ 
    public enum EnumImplementation implements EnumInterface 
    { 
     FOO("foo"), 
     BAR("bar"); 

     String string; 

     EnumImplementation(String field) 
     { 
      this.string = string; 
     } 

     @Override 
     public String getString() { 
      return string; 
     } 
    } 

    @Override 
    public Enum<?> getEnums() { 
     return ?; 
    }  
} 

上面的代码不工作,我只是想来形容我的问题。 如果可能,我也想强制枚举返回类型为EnumInterface。 如果您知道如何强制执行特定的枚举实现,那么更好,因为我甚至不需要在ParentClass中定义函数。

那么,如何返回枚举以便我可以这样做instanceOfParentClass.getEnums().FOO

+3

为什么你想这样做/什么是你想达到什么目的?有可能是更好的方法... –

+0

我想使用它们来映射属性名称到数据库字段 – William

+0

@TimB我想用它们将类属性名称映射到数据库字段名称。我想迫使开发人员准备它们之间的接口。有时我想使用枚举来定义在UI上显示哪个属性。枚举使我能够轻松定义要使用的属性并将它们传递给其他类,如下所示:'Class.Attribute.NAME'。你有更好的解决方案吗? – William

回答

1

这个怎么样:

public <T extends Enum<T> & EnumInterface> T[] getEnums() { 
    return (T[])EnumImplementation.values(); 
} 

注投,这可能会导致ClassCastException。 为了防止这种情况,你可以通过枚举类或只是返回的EnumInterface数组:

public <T extends Enum<T> & EnumInterface> T[] getEnums(Class<T> enumType) 
public <T extends Enum<T> & EnumInterface> EnumInterface[] getEnums() 

注意,这并不能使你要调用的方法类似getEnums().FOO,但你可以通过类和名称,例如

public <T extends Enum<T> & EnumInterface> T[] getEnum(Class<T> enumType, String enumName) { 
    return Enum.valueOf(enumType, enumName); 
} 

但是,就像Tim B所说的那样,对于你试图达到的目标可能会有更好的选择。

+0

虽然这不会让他做getEnums.FOO。 –

+0

@TimB你是对的,忽略了 – Thomas

+0

感谢你的回答,你可以看看我对Tim主要问题的评论。对于我的问题,你有没有比这更好的解决方案? – William

0

试试这个。

EnumInterface

public interface EnumInterface { 
    public String getString(); 
} 

父类

public abstract class ParentClass<ENUM_TYPE extends Enum<ENUM_TYPE> & EnumInterface> { 
    public abstract ENUM_TYPE getEnums(); 
} 

ChildClass

public class ChildClass extends ParentClass<ChildClass.EnumImplementation> { 
    public static enum EnumImplementation implements EnumInterface { 
     FOO("foo"), 
     BAR("bar"); 

     String string; 

     EnumImplementation(String field) { 
      this.string = field; 
     } 

     @Override 
     public String getString() { 
      return string; 
     } 
    } 

    public EnumImplementation getEnums() { 
     return EnumImplementation.values()[0]; 
    } 

    public static void test() { 
     Object result = new ChildClass().getEnums().FOO; 
    } 
} 

注意getEnums()返回一个枚举值。无法返回枚举容器本身,但可以从任何值调用其他枚举值(f.e. EnumImplementation.FOO.BAR.FOO

0

为了将属性名称映射到数据库字段,可以使用enum valueOf方法。

你需要做在类的映射,你不能将引用传递到静态枚举:

http://www.tryjava8.com/app/snippets/52b86150e4b0f5090255bc45

import java.util.*; 
public class Main{ 

    static enum TestE { 
     FOO, 
     BAR 
    } 

    static class TestC { 
    TestE getEnum(String name) { 
     return TestE.valueOf(name); 
    } 
    } 

    public static void main(String[] args){ 
    System.out.println(TestE.FOO); 
    System.out.println(new TestC().getEnum("BAR")); 
    } 
}