java可转换枚举
我想创建一个枚举类型,该类型将具有一个值,并且可以从该值转换为该值,反之亦然(基本上,枚举将是该值的类型安全别名,并将提高代码可读性) 我之所以需要它,是因为我在处理低级的、嵌入式的东西,以及写寄存器等等。 很多时候,寄存器中的一些位具有特殊的含义。与一个寄存器的第10-11位类似,它也是活动的CYCCNT " 00-CYCCNT_24, 01-CYCCNT_26, 11-CYCNT_28 " 现在我想做这样的事情: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
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不能扩展其他类).有没有办法减少代码重复?嗨!谢谢你的回答。目标是使它自动化(即