наследование enum или что-то подобное - PullRequest
7 голосов
/ 09 мая 2011

У меня есть строка (которая является сообщением), которую я получаю в качестве ввода, и мне нужно сделать одну из 4 возможных вещей в зависимости от строки Я знаю, что есть опция eunm.valueOf (), но у меня есть 4 различных перечисления, каждое с несколькими возможными сообщениями.

выглядит примерно так:

public enum first{ONE,TWO,THREE};
public enum second{FOUR,FIVE,SIX};
public enum third{SEVEN,EIGHT,NINE};

public void work(String message){
    //Here I want to compare message string to one of the 3 enums
}

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

Ответы [ 6 ]

6 голосов
/ 09 мая 2011

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

Но если вы это сделаете, вы можете заставить их реализовать общий интерфейс. Затем вы можете сопоставить входные строки с соответствующим членом перечисления и вызвать его метод, чтобы выполнить то, что вы хотите. Что-то вроде

public interface SomeInterface {
  void doSomething();
};

public enum First implements SomeInterface {
  ONE,TWO,THREE;
  @Override
  public void doSomething() { ... }
};
...
Map<String, SomeInterface> myMap = new HashMap<String, SomeInterface>();
for (First item : First.values()) {
  myMap.put(item.toString(), item);
}
...

public void work(String message){
  SomeInterface obj = myMap.get(message);
  if (obj != null) {
    obj.doSomething();
  }
}

Это предполагает, что 4 возможных вещи, которые вы хотите сделать, соответствуют 4 перечислениям. Если нет, вы можете переопределить метод отдельно для каждого члена enum, например,

public enum First implements SomeInterface {
  ONE,
  TWO {
    @Override
    public void doSomething() { // do something specific to TWO }
  },
  THREE;
  @Override
  public void doSomething() { // general solution for all values of First }
};
1 голос
/ 09 мая 2011

Вы можете создать карту из них всех

 static final Map<String, Enum> enumMap = new LinkedHashMap<String, Enum>(){{
     for(First e: First.values()) put(e.name(), e);
     for(Second e: Second.values()) put(e.name(), e);
     for(Third e: Third.values()) put(e.name(), e);
 }};

 Enum e = enumMap.get(name);
1 голос
/ 09 мая 2011

Перечисления в Java являются полноценными классами.Индивидуальные ценности могут даже переопределить поведение, чтобы удовлетворить их потребности.Это довольно круто.Вы можете использовать это в своих интересах:

public enum Value implements Worker
{
    ONE,
    TWO,
    THREE
    {
        @Override
        public void doWork(String message)
        {
            // overrides behavior of base enum
        }
    },
    FOUR,
    /* ... */,
    NINE;

    private final String message;

    Value() { this(""); }
    Value(String message) { this.message = message; }

    public void doWork(String message)
    {
        if (this.message.equals(message))
        {
            /* ... */
        }
    }
}

public interface Worker
{
    void doWork(String message);
}
1 голос
/ 09 мая 2011

То, что вы действительно ищете, - это совокупность других перечислений.Самый простой способ получить это - создать новый enum, который поместит все эти варианты выбора в новый enum.Что-то на этот счет:

public enum Combination {
    NEWONE(first.ONE), NEWTWO(first.TWO), NEWTHREE(first.THREE),
    NEWFOUR(second.FOUR), NEWFIVE(second.FIVE), NEWSIX(second.SIX),
    NEWSEVEN(third.SEVEN), NEWEIGHT(third.EIGHT), NEWNINE(third.NINE);

    private String contents;

    public Combination(first f) {
        contents = f.toString();
    }

    public Combination(second s) {
        contents = s.toString();
    }

    public Combination(third t) {
        contents = t.toString();
    }

    public String toString() {
        return contents;
    }
}

Это будет более правильно объединить предыдущие перечисления в единую структуру данных.

0 голосов
/ 09 мая 2011

Даже учитывая ваш нечетный / четный пример в комментариях, я не чувствую, что множественные перечисления являются подходящим способом.Я бы использовал что-то вроде (предупреждение, не проверено):

public enum Numbers {
ONE("first"), TWO("first"), THREE("first"), FOUR("second"), FIVE("second"), SIX("second"), SEVEN("third"), EIGHT("third"), NINE("third")

private String type;

Numbers(String t) { this.type = t; }
String getType { return this.type; }
}

Тогда вы можете использовать valueOf() для поиска элемента enum и getType(), чтобы узнать, к какой из трех ваших категорий он принадлежит.

0 голосов
/ 09 мая 2011

Не совсем понятно, о чем вы спрашиваете, но, возможно, вы хотите определить соответствие между строками и константами, например так:

enum Type { FIRST, SECOND, THIRD };
Map<String, Type> mapping = new HashSet<String, Type>(){{
    put("ONE", Type.FIRST);
    put("TWO", Type.FIRST);
    //...
    put("NINE", Type.THIRD);
}};

public Type getTypeFromString(String s) {
    return mapping.get(s);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...