2016-12-29 7 views
0

У меня есть перечисление, которое содержит определенные типы вместе и определенные поля для каждого типа.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().

Как достичь этого наилучшим образом?

Любая помощь приветствуется.

+0

Я бы предложил вам заменить поле типа полем определения и дать A иметь 100, B 200 и т. Д., Потому что вы можете захотеть иметь A1, A2, G7, Z9 - ну, на самом деле, но ради расширяемости, замена типа с определением полностью всегда лучше, если вы не обновляете широко используемую библиотеку. – glee8e

+0

Я бы предложил вам переименовать метод «Типы getName (int type)». Не могли бы вы добавить некоторые javadoc, чтобы мы могли понять, что должен делать метод? Это что-то вроде «Типы getByTypeKey (int typeKey)»? –

+0

@TobiasOtto: Да, это 'getByTypeKey (int typeKey)'. 1 -> Тип A, тип 2 -> B, 3 -> C тип –

ответ

0

Это зависит от того, действительно ли ваши Cx перечисления имеют тот же класс, что и A, B и т. Д. На это нельзя ответить без знания вашей модели домена.

Просто от синтаксиса, я бы, вероятно, сделать Types провести definition и type поля, definition являясь первичным ключом. Затем два конструктора, один с обоими definition и type, а другой только с definition (type присваивается то же значение, что и definition). Это в основном то, что вы предложили с двумя полями, но вместо null для не Cx просто рассмотрите definition равным type.

+0

A, B, C, D - разные типы, а C1, C2 .. имеют тип C. И атрибут 'definition' предназначен только для type 'Cx', поэтому типу нельзя присвоить значение, аналогичное определению. И можете ли вы привести пример того, как будут работать два конструктора? –

Смежные вопросы