gpt4 book ai didi

java - 扩展枚举属性

转载 作者:行者123 更新时间:2023-11-29 04:21:15 27 4
gpt4 key购买 nike

我有一个像这样的简单枚举

public enum TypeId {
Unknown(0),
I1(1),
I2(2),
I4(3),
I8(4),
Ui1(5),
Ui2(6),
Ui4(7)
// ...
;
private final int ID;
private TypeID (int id) { ID = id; }
public int getID () { return ID; }
public static TypeID getTypeID(int id) { ... }
};

还有一个更复杂的,包含更多数据,但涵盖通过相同 ID 号关联的相同元素。

public enum DataType {
T_Null(0, "NULL", Types.NULL, 0, 0),
T_Int8(1, "TINYINT", Types.TINYINT, 1, 4),
T_Int16(2, "SMALLINT", Types.SMALLINT, 2, 6),
T_Int32(3, "INTEGER", Types.INTEGER, 4, 11),
T_Int64(4, "BIGINT", Types.BIGINT, 8, 20),
T_UInt8(5, "BYTE", Types.TINYINT, 1, 3), // 0 -> 255
T_UInt16(6, "USHORT", Types.SMALLINT, 2, 5), // 0 -> 65535
T_UInt32(7, "UINT", Types.INTEGER, 4, 10) // 0 -> 4294967295
// ...
;
private final int typeCode, sqlTypeCode, binSize, dispSize;
private String typeName;

private DataType(int typeCode, String typeName, int sqlTypeCode, int binSize, int dispSize) {
this.typeCode = TypeCode;
this.typeName = TypeName;
this.sqlTypeCode = sqlTypeCode;
this.binSize = binSize;
this.dispSize = dispSize;
}
public String getName() { return typeName; }
// other getters
};

现在给出了第一个枚举,第二个是一种扩展。这可以使用 extends 或类似的方法来实现吗?

我想实现自动维护/检查通过相同 (ID == typeCode) 的链接。

一个想法是用 TypeId 包含的元素替换 int typeCode。

问题:

  • 这是好主意还是坏主意?
  • 是否有更好的方法将这两个类结合起来?
  • 将“扩展名”定义为枚举是否好? (或者更确切地说是静态最终数组?)

最佳答案

您无法扩展枚举,但是组合可以达到类似的结果。

public enum DataType {
T_Null(TypeId.Unknown, "NULL", Types.NULL, 0, 0),
T_Int8(TypeId.I1, "TINYINT", Types.TINYINT, 1, 4),
T_Int16(TypeId.I2, "SMALLINT", Types.SMALLINT, 2, 6),
T_Int32(TypeId.I4, "INTEGER", Types.INTEGER, 4, 11),
T_Int64(TypeId.I8, "BIGINT", Types.BIGINT, 8, 20),
T_UInt8(TypeId.Ui1, "BYTE", Types.TINYINT, 1, 3), // 0 -> 255
T_UInt16(TypeId.Ui2, "USHORT", Types.SMALLINT, 2, 5), // 0 -> 65535
T_UInt32(TypeId.Ui4, "UINT", Types.INTEGER, 4, 10) // 0 -> 4294967295
;
private final TypeId typeId;
private final int sqlTypeCode, binSize, dispSize;
private final String typeName;

private DataType(TypeId typeId, String typeName, int sqlTypeCode, int binSize, int dispSize) {
this.typeId = typeId;
this.typeName = typeName;
this.sqlTypeCode = sqlTypeCode;
this.binSize = binSize;
this.dispSize = dispSize;
}
public String getName() { return typeName; }
// other getters

public static DataType ofType(TypeId typeId) {
for (DataType dt : values())
if (dt.typeId == typeId)
return dt;
return T_Null;
}

};

大概您有动力更自然地使用现有 API。如果现有的 api 是:

public TypeId someApi(int i) {  ....  }

public void myApi(DataType dt) { ... you prefer to use DataType ... }

那么您现在有一种自然的方式来调用 myApi,如下所示:

myApi(DataType.ofType(someApi(5)));

关于java - 扩展枚举属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49030583/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com