Расширение перечисления в Java - PullRequest
23 голосов
/ 28 июня 2011

У меня есть перечисление, давайте назовем его A:

public enum A
{
    A,
    B
}

У меня есть функция, которая принимает перечисление A:

public void functionA(A enumA)
{
    //do something
}

Как я могу создать другое перечисление, возможно, вызовВ, что я могу передать функции A ?Что-то вроде этого?

public enum B
{
    C
}

functionA(B.C);

Я знаю, что вы не можете расширять перечисление, но какие еще варианты у меня есть?Каков наилучший способ добиться этого?

Ответы [ 4 ]

48 голосов
/ 28 июня 2011

Вы не можете.

Типы перечислений являются окончательными.

Причина в том, что каждый тип перечисления должен иметь только элементы, объявленные в перечислении (как мы можем использовать их, например, в операторе switch), и это невозможно, если вы разрешите расширить тип.

Вы можете сделать что-то вроде этого:

public interface MyInterface {
    // add all methods needed here
}

public enum A implements MyInterface {
    A, B;
    // implement the methods of MyInterface
}

public enum B implements MyInterface {
    C;
    // implement the methods of MyInterface
}

Обратите внимание, что тогда невозможно сделать switch с этим интерфейсом. (Или вообще есть switch с объектом, который может прийти из более чем одного enum).

17 голосов
/ 28 июня 2011

Вы можете реализовать общий интерфейс

interface I { }

enum A implements I {
   A, B
}
enum B implements I {
   C
}
public void functionA(I i) {
    //do something
}

obj.functionA(A.A);
obj.functionA(B.C);
5 голосов
/ 28 июня 2011

Вы не можете заставить Enums расширять другие Enums, но вы можете объявить интерфейс, который могут реализовать все ваши Enums.Интерфейс должен включать любые методы, которые вы ожидаете вызывать для значений Enum.Вот пример ...

public class Question6511453 {
    public static void main(String[] args) {
        System.out.println(functionFoo(EnumA.FirstElem));
        System.out.println(functionFoo(EnumA.SecondElem));
        System.out.println(functionFoo(EnumB.ThirdElem));
    }

    private interface MyEnums {
        int ordinal();
    }

    private enum EnumA implements MyEnums {
        FirstElem,
        SecondElem
    }

    private enum EnumB implements MyEnums {
        ThirdElem
    }

    private static int functionFoo(MyEnums enumeration) {
        return enumeration.ordinal();
    }
}

Единственная проблема этого решения состоит в том, что оно лишает вас возможности использовать Enum, как вы обычно хотели бы в операторах switch, поскольку порядковые номера и значения могут быть не уникальнымибольше.

Это должно ответить на ваш вопрос, но я сомневаюсь, что это действительно поможет вам с вашей проблемой.(

4 голосов
/ 28 июня 2011

Вам следует добавить элемент C в ваше перечисление A. Если это что-то не связанное и добавление не имеет смысла, то, вероятно, не должна обрабатываться функция A ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...