Проблема Java ENUM - PullRequest
       27

Проблема Java ENUM

2 голосов
/ 20 февраля 2010

У меня есть два Enum с следующим образом:

enum Connector {
    AND, OR, XOR;
}

enum Component {
    ACTIVITY
}

Теперь у меня есть переменная с именем follower в классе Event. Эта переменная (follower) может иметь (и должна иметь) значение из любого из двух указанных выше Enum s.

Итак, какой тип данных я должен дать переменной follower?

Ответы [ 5 ]

5 голосов
/ 20 февраля 2010

Объявите интерфейс для поля follower.

public interface Follower {
    // any methods
}

И оба перечисления реализуют этот интерфейс.

public enum Connector implements Follower {
    AND, OR, XOR;
}


enum Component implements Follower {
    ACTIVITY
}

Тогда вы можете объявить свое поле:

Follower follower = Connector.OR;  

Или

Follower follower = Component.ACTIVITY;

У этого есть несколько явных преимуществ по сравнению с объявлением поля как Enum<? extends Follower> (о котором я могу думать). Таким образом, вы можете свободно добавлять методы в интерфейс Follower без необходимости изменения полей в будущем, тогда как вы не можете контролировать тип Enum, поэтому, если вы решили, что Follower s нужен метод, вы пришлось бы изменить декларацию в любом месте. Это может никогда не иметь место с вашим сценарием, но с таким небольшим количеством затрат, чтобы использовать этот способ, это хорошая защитная практика.

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

2 голосов
/ 20 февраля 2010

Вы можете использовать интерфейс для обоих перечислений:

interface X {}

enum Connector implements X{
    AND, OR, XOR;
}

enum Component implements X{
    ACTIVITY
}
2 голосов
/ 20 февраля 2010
private Enum follower;

И вы можете заставить оба перечисления реализовывать один и тот же интерфейс, например, Follower, и позволить полю иметь значение:

private Enum<? extends Follower> follower;

Но вам лучше все переделать, это не так.

0 голосов
/ 20 февраля 2010

Почему бы не иметь последователя типа java.lang.Enum. Это родитель всех перечислений в Java. Так что следующий код работает просто отлично.

</p> <p>package com.test;</p> <p>enum NewEnum { one, two; }</p> <p>enum Another { three, four; }</p> <p>public class TestMe {</p> <pre><code>static Enum num = NewEnum.one; public static void main(String[] args) { System.out.println(num.toString()); num = Another.three; System.out.println(num.toString()); }

}

0 голосов
/ 20 февраля 2010

Я бы предложил создать новый класс с именем Follower. Я не уверен, что одна переменная должна иметь два разных типа, даже если это возможно.

Я склонен думать о Enums как о примитивных типах данных, и ваш вопрос был бы как вопрос, как сделать переменную int или long.

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