java可转换枚举

java可转换枚举,java,generics,inheritance,enums,Java,Generics,Inheritance,Enums,我想创建一个枚举类型,该类型将具有一个值,并且可以从该值转换为该值,反之亦然(基本上,枚举将是该值的类型安全别名,并将提高代码可读性) 我之所以需要它,是因为我在处理低级的、嵌入式的东西,以及写寄存器等等。 很多时候,寄存器中的一些位具有特殊的含义。与一个寄存器的第10-11位类似,它也是活动的CYCCNT " 00-CYCCNT_24, 01-CYCCNT_26, 11-CYCNT_28 " 现在我想做这样的事情: void setActiveCYCCNT(CYCCNT_ENUM newval

我想创建一个枚举类型,该类型将具有一个值,并且可以从该值转换为该值,反之亦然(基本上,枚举将是该值的类型安全别名,并将提高代码可读性)

我之所以需要它,是因为我在处理低级的、嵌入式的东西,以及写寄存器等等。 很多时候,寄存器中的一些位具有特殊的含义。与一个寄存器的第10-11位类似,它也是活动的CYCCNT " 00-CYCCNT_24, 01-CYCCNT_26, 11-CYCNT_28 "

现在我想做这样的事情:

void setActiveCYCCNT(CYCCNT_ENUM newvalue)
{
  Target.writeRegister(ADDRESS, newvalue.value());
}

CYCCNT_ENUM getActiveCYCCNT()
{
  return CYCCNT_ENUM.fromValue(Target.readRegister(ADDRESS));
}
我曾想过这样做(但在许多层面上语法上是不正确的):

静态成员似乎无法访问T。我不知道为什么会这样,java不是为每个引用的泛型类型生成一个新类吗? 其次,java似乎不支持通用枚举

public enum ConvertableEnum<T> {

    private static Map<T, ConvertableEnum<T>> map = new HashMap<T, ConvertableEnum<T>>();
    T value;

    public ConvertableEnum(T t)
    {
        this.value = t;     
        map.put(t, this);
    }

    public static ConvertableEnum<T> fromValue(T t)
    {
        return map.get(t);
    }

  }
公共枚举可转换枚举{
private static Map=new HashMap();
T值;
公共可转换枚举(T)
{
该值=t;
map.put(t,this);
}
公共静态可转换枚举fromValue(T)
{
返回map.get(t);
}
}
在这之后,我们可以做:

public enum CYCCNT : ConvertableEnum<int>
{
  CYCCNT_24(0x00), CYCCNT_26(0x01), CYCCNT_28(0x03);
}
public enum cycnt:ConvertableEnum
{
CYCCNT_24(0x00)、CYCCNT_26(0x01)、CYCCNT_28(0x03);
}
用这个

我的问题是如何在语法错误的代码中实现我想要实现的目标

谢谢你的帮助,
axos88

我最近也做了类似的事情:

public enum ReferenceType 
{
    SELECT(true),
    INSERT(false),
    SELECT_INTO(false),
    UPDATE(false),
    DELETE(false),
    CREATE_TABLE(false),
    DROP_TABLE(false),
    PRINT(false),
    FROM(false),
    DECLARE(false);

    private final boolean legalSub;

    ReferenceType(boolean _legalSub)
    {
        this.legalSub = _legalSub;
    }

    public boolean isLegalSubstatement()
    {
        return this.legalSub;
    }
}
因此,引用类型ID是,例如,
INSERT
,但(或其中一个)关联值是false,该值在声明中设置(
INSERT(false)
),可以使用isLegalSubstatement()检索。类似地,可以有多个字段与每个ID关联,只要分别将它们包含在构造函数中。可以将每个枚举项视为引用数据表中的一行,其中ID是表键,其他字段(在parenths中)是与该键关联的列

当然,具有与枚举键关联的属性是可选的,即枚举可以是没有任何属性的简单枚举


这回答了您的问题吗?

您的枚举中可以有一个函数:

public enum CYCCNT /* Should use Camel-case names */
{
  CYCCNT_24, CYCCNT_26, CYCCNT_28;

  public static int toValue(CYCCNT e) {
    switch (e) {
      case CYCCNT_24: return 0x0;
      //...
      default: throw new RuntimeException("Enum value not handled");
    }
  }

  public int toValue() {
    return CYCCNT.toValue(this);
  }
}

按照建议,您还可以放置一个成员变量来保存实际值。不过,我想这会增加枚举实例的原始大小(但不确定是否会增加)。

枚举只是一种特殊类型的类,例如,枚举可以有成员变量

因此,只需声明一个枚举类型,每个枚举都有一个关联的地址,以及关联的getter和helper函数

public enum CYCCNT_ENUM{
    Value1("a"),
    Value2("b");

    private final String address;

    private CYCCNT_ENUM(String address) {
        this.address= address;
    }

    public String getAddress() {
        return address;
    }

    public static CYCCNT_ENUMgetScope(String address) {
        for(CYCCNT_ENUM e : values()){
            if(address.equals(e.getAddress())){
                return e;
            }
        }
        return null;
    }
}

enum使用通用接口没有问题。唯一的问题是枚举不能是泛型的。此外,GenericVariables不能是privative,因此代码:

    public enum CYCCNT implements ConvertableEnum<Integer>
    {
      CYCCNT_24(0x00), 
      CYCCNT_26(0x01), 
      CYCCNT_28(0x03);

      private int value; 

      CYCCNT(int value) {
        this.value = value;
      }

     public Integer getValue() {
        return this.value;
     }   

    private final static HashMap<Integer,CYCCNT> valueOfMap = new HashMap<Integer,CYCCNT>();  

    static {
      for(CYCCNT cyccnt : CYCCNT.values()) {
         valueOfMap.put(cyccnt.getValue(), cyccnt);
      )
     }
    public static CYCCNT valueOf(int value) {
       return valueOfMap.get(value);
    }
  }
public enum cycnt实现可转换枚举
{
CYCCNT_24(0x00),
CYCCNT_26(0x01),
CYCCNT_28(0x03);
私有int值;
CYCCNT(int值){
这个值=值;
}
公共整数getValue(){
返回此.value;
}   
private final static HashMap valueOfMap=new HashMap();
静止的{
对于(CYCCNT CYCCNT:CYCCNT.values()){
map.put的值(cyccnt.getValue(),cyccnt);
)
}
公共静态循环值(int值){
返回map.get的值(value);
}
}
应该有效

直接解决方案
Enum.class
有一个方法
static T valueOf(class enumType,String name)

返回具有 指定的名称

每个枚举类型还具有一个
公共静态E值of(字符串名称)
方法

因此,通过使用适当的值初始化enum常量,您就拥有了所需的一切

更好的解决方案
考虑
第32项:使用枚举集而不是位字段,即直接使用
EnumSet
类而不是位字段可能更好。

这是不正确的。
Enum
类本身(不是单个枚举类型)有一个方法
公共静态T值(类枚举类型,字符串名称)
。每个枚举类型还具有一个
公共静态E值(字符串名称)
method。如果值是字符串,并且由我控制,这将是一个很好的解决方案。但是它们不是。我仍然需要一个手动初始化的映射来从整数值中查找字符串,这将违背解决方案的目的。嗯……这似乎是一个很好的解决方案。但是我有一个问题:如果我有很多相似的枚举,我必须将实现复制并粘贴到每个枚举吗?我刚刚发现枚举不能扩展任何东西…@kosVandra,是的,你不能继承或扩展枚举。你可以将共享元素的枚举重新组织为单个元素。但你要记住,枚举应该帮助你对代码进行arganize。IMHO不应该太大。你的这个问题真的很难回答,因为我不知道您想在枚举中存储什么。我不是指共享枚举元素,而是指这些负责转换的方法。很抱歉,但不是。我的问题是以另一种方式转换,例如,使用(唯一)属性值,然后返回枚举元素(当然,为了做到这一点,属性必须是唯一的,而且它们是唯一的)。在这种情况下,您需要创建一个静态集合(例如,映射)并将其填充到静态块中,设置唯一属性的键和枚举ID的val。然后编写getter getEnumIdByUnqAtt(unqAtt)它通过该集合的唯一属性返回枚举ID Hi!您的答案与Vash的答案非常相似。我的问题是相同的。如果我有许多这样的枚举,该怎么办?我必须将实现复制并粘贴到每个枚举中吗?(enum不能扩展其他类).有没有办法减少代码重复?嗨!谢谢你的回答。目标是使它自动化(即