У меня есть перечисление, которое содержит определенные типы вместе и определенные поля для каждого типа.Enum с некоторыми повторяющимися значениями?
public enum Types {
A (1, A.class, "stringA"),
B (2, B.class, "stringB"),
C (3, C.class, "stringC"),
C1(3, C1.class, "stringC"),
C2(3, C2.class, "stringC"),
C3(3, C3.class, "stringC"),
.
.
D (4, D.class, "stringD"),
E (5, E.class, "stringE"),
F (6, F.class, "stringF"),
.
.
.
.
private int type;
private Class<?> className;
private String longname;
private Types(int type, Class<?> className, String longName)
{
this.type = type;
this.className = className;
this.longName = longName;
}
//..... getter, setters
// returns name from type passed
public static Types getName(int type) {
for (Types e : Types.values()) {
if (type == e.type)
return e;
}
return null;
}
}
Теперь все было в порядке, пока не было дубликатов ключей для типов. Таким образом, TypeC
имеет подтип C1, C2..
, таким образом, имеет тот же самый тип, что и 3
.
Он имеет способ getName()
, который дает тип, итерируя values
перечисления.
Теперь C1, C2, C3...
все карты с одинаковым значением 3.
типа Теперь для дифференциации типов C, у меня есть еще одно имя переменной definition
только для C
подтипов. Так значения definition
являются:
C1 100
C2 101
C3 101
Таким образом, чтобы получить уникальный элемент перечисления для типа C, мне нужно два значения type
и definition
обоих.
Я думал два подход:
Либо, чтобы добавить новое поле для всего перечисления имени definition
, так что это приведет к нулевому значению для других типов, кроме C.
Или создать новое перечисление для подтипов C и использовать это перечисление для получения подтипов подтипа C вместо getName()
.
Как достичь этого наилучшим образом?
Любая помощь приветствуется.
Я бы предложил вам заменить поле типа полем определения и дать A иметь 100, B 200 и т. Д., Потому что вы можете захотеть иметь A1, A2, G7, Z9 - ну, на самом деле, но ради расширяемости, замена типа с определением полностью всегда лучше, если вы не обновляете широко используемую библиотеку. – glee8e
Я бы предложил вам переименовать метод «Типы getName (int type)». Не могли бы вы добавить некоторые javadoc, чтобы мы могли понять, что должен делать метод? Это что-то вроде «Типы getByTypeKey (int typeKey)»? –
@TobiasOtto: Да, это 'getByTypeKey (int typeKey)'. 1 -> Тип A, тип 2 -> B, 3 -> C тип –