Подтвердить что ты не робот

Расширение перечисления в Java

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

public enum A
{
    A,
    B
}

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

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

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

public enum B
{
    C
}

functionA(B.C);

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

4b9b3361

Ответ 1

Вы не можете.

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

Причина в том, что каждый тип перечисления должен иметь только элементы, объявленные в enum (например, мы можем использовать их в инструкции 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).

Ответ 2

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

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);

Ответ 3

Вы не можете заставить 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

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