2015-03-18 3 views
2

ЕслиСм перечисление внутри перечисления

enum Things{ 
    UNIQUE_THING, 
    NON_UNIQUE_THINGS; // Need to specify what n0n-unique things as a separate enum 
} 

enum NonUniqueThings { 
    THING_1, 
    THING_2; 
} 

Есть ли способ передать только один перечисление Things и указать поведение NonUniqueThings в нем? То, что я имел в виду, можно назвать звонящего по телефону, как -

Things.UNIQUE_THING 

или

Things.NON_UNIQUE_THING.THING_1 

Любые идеи, пожалуйста?

ответ

3

Вы можете ввести параметр с нулевым значением для Things, который будет содержать значение NonUniqueThings. Конечно, вы должны предоставить конструктор для Things плюс getter для параметра, чтобы получить значение NonUniqueThings.

Обратите внимание, что я предполагаю, что UNIQUE_THING не будет связан с какой-то NonUniqueThing, и именно поэтому это экземпляр с null в качестве параметра.

enum Things{ 
    UNIQUE_THING(null), 
    NON_UNIQUE_THINGS(NonUniqueThings.THING_1); 

    NonUniqueThings param; 

    Things(NonUniqueThings param) { 
     this.param = param; 
    } 

    public NonUniqueThing getNonUniqueThing() { 
     return param; 
    } 
} 

Затем, вы можете получить значение NonUniqueThings, связанное с каждым из Things значений, например:

NonUniqueThings nonUniqueThing = Things.NON_UNIQUE_THING.getNonUniqueThing(); 
+0

Вы не жесткое кодирование THING_1 в строке 3 , что, если пользователь хочет называть Things.NON_UNIQUE_THING.THING_2. Я новичок в Java и пробовал THING_2 для вашего решения. – Prakhar

+0

Да, я. Но это только характер значений enum в Java. Если вам нужно поддерживать несколько вложенных значений, вы можете изменить тип массива 'param' в массив (' NonUniqueThings [] '), а затем при определении' NON_UNIQUE_THINGS' выполнить 'NON_UNIQUE_THINGS ({NonUniqueThings.FIRST, NonUniqueThings.SECOND}) '. –

+0

Хорошо, мне просто нужно одно NonUniqueThing за раз. Благодарю. – Prakhar

2

что-то вроде этого? Никакого реального решения не должно работать.

enum Things { 
     UNIQUE_THING, 
     NON_UNIQUE_THING(
      NonUniqueThings.A, 
      NonUniqueThings.C); 

    public final Child[] childs; 

    private Things() { 
     this.childs = null; 
    } 

    private Things(Child... childs) { 
     this.childs = childs; 
    } 
} 

interface Child { 
    // 
} 

enum NonUniqueThings implements Child { 
    A, 
    B, 
    C; 
} 
+0

ok я вижу решение kocko проще – dit

+0

Это тоже приятное решение. –

1

Здесь вы идете (если я понял вашу потребность правильно):

public enum Things { 
    UNIQUE_THING, NON_UNIQUE_THINGS; 

    public enum NonUniqueThings { 
     THING_1, THING_2; 
    } 
} 

Может быть доступен как:

Things.NonUniqueThings.THING_1 
+0

Что такое NON_UNIQUE_THINGS (элемент перечисления) для этого, если имеется отдельный перечисление для NonUniueThings? – Prakhar

+0

Я думал, что вы хотите получить доступ к NonUniqueThings вложенным образом. В случае, если вы имеете в виду, что вторая опция выбора зависит от первых, вам нужно пойти с решением kocko. –