Java Enum ссылается на другой enum - PullRequest
6 голосов
/ 02 марта 2011

Я хотел бы иметь возможность определить класс Enum, который будет включать в себя другой Enum, а также его собственные значения.Например:

public enum A {
    A1, A2, A3;
}

public enum B{
    B1, B2, ...(somehow define references to all values in enum A)
}

, так что любые значения, содержащиеся в перечислении B, должны быть определены либо initself (например, B1, B2), либо любыми значениями перечисления A.

Спасибо,

Ответы [ 4 ]

5 голосов
/ 02 марта 2011

Так, что B является объединением A и B?Это невозможно без B расширение A, которое не поддерживается в Java.Чтобы продолжить, создайте enum, который содержит объединенные значения A и B, например,

enum C {
    A1, A2, A3, B1, B2;
}
2 голосов
/ 05 августа 2015

Как правило, так как мы работаем в Java и обычно запрещаем OO design, вы можете получить эту функциональность через расширение.Однако перечисления расширяют java.lang.Enum неявно, и поэтому не может расширять другой класс.

Это означает, что расширяемость для перечислений в большинстве случаев происходит из другого источника.

Джошуа Блох добавляет это в Effective Java: Second Edition в пункте 34, когда он представляет шаблон общего интерфейса для перечислений.Вот его пример шаблона:

   public interface Operation {
        double apply(double x, double y);
    }

    public enum BasicOperation implements Operation {
        PLUS("+") {
            public double apply(double x, double y) { return x + y; }
        },
        MINUS("-") {
            public double apply(double x, double y) { return x - y; }
        },
        TIMES("*") {
            public double apply(double x, double y) { return x * y; }
        },
        DIVIDE("/") {
            public double apply(double x, double y) { return x / y; }
    }

Это примерно как можно ближе к общему состоянию, когда дело доходит до перечислений.Как сказал выше Йохан Шёберг, было бы проще всего объединить перечисления в другое перечисление.

Удачи!

2 голосов
/ 02 марта 2011

Как то так?

enum A {
    A1, A2;
}

enum B {
    B1(null),
    B2(null),
    A1(A.A1),
    A2(A.A2);

    private final A aRef;
    private final B(A aRef) {
        this.aRef = aRef;
    }
}
1 голос
/ 03 марта 2011

Самое близкое, что вы можете получить, это заставить А и В реализовать некоторый общий интерфейс.

enum A implements MyEnum{A1,A2}
enum B implements MyEnum{B1,B2}

MyEnum e = B.B1;

Это решение не будет работать ни с оператором switch, ни с оптимизированными коллекциями enum.

Ваш вариант использования не поддерживается реализацией java enum, он либо сложен для реализации (по сравнению с его полезностью), либо не подходит (ни один из немногих известных мне языков не поддерживает это напрямую).

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