Не могу использовать мой Enum

Я действительно не знаю, что я делаю неправильно!

Я создал это перечисление:

public enum CoffeeSorts {
 Coffee("Kaffee"), Espresso("Espresso"), Mocca("Mocca"), Cappuccino(
 "Cappuccino"), LatteMacchiato("Latte Macchiato"), **************(
 "doppelter Espresso");

 private final String stringValue;

 private CoffeeSorts(final String s) {
 stringValue = s;
 }

 public String toString() {
 return stringValue;
 }
}

и я пытаюсь использовать его так:

public ACoffee createCoffee(String type) {

 switch (type) {
 case CoffeeSorts.Cappuccino :
 try {
 return new ChocolateSprincles(new Cream(new Coffee()));
 } catch (Exception e) {}
 return null;
 break;
 case CoffeeSorts.LatteMacchiato :
 try {
 return new ...
 }
 .
 .
 .
 }

Это только дает мне ошибку, говоря "не может конвертировать из CoffeeSorts в String". Можете ли вы сказать мне, что я сделал неправильно?

Спасибо за все ваши ответы! Ответ, который дал мне именно то, что мне нужно было использовать.name(), но парень удалил его снова по неизвестной причине.

3 ответа

Ваша переменная type является String, но вы пытаетесь указать значения, которые являются значениями CoffeeSort. Сначала вам нужно преобразовать String в CoffeeSort или изменить подпись.

Например:

public ACoffee createCoffee(CoffeeSort type) {
 ...
}

или

public ACoffee createCoffee(String typeName) {
 CoffeeSort type = CoffeeSort.valueOf(typeName);
 ...
}

Также обратите внимание, что вы не можете break; после заявления о return, поскольку это недостижимый код. (Надеюсь, что обработка исключений на самом деле не такая, либо...)

Наконец, рассмотрите возможность изменения кода полностью, чтобы поместить метод createCoffee внутри самого перечисления. Тогда вам не понадобится инструкция switch вообще. Вы можете сделать его абстрактным методом, который переопределяется в каждом значении перечисления.

public enum CoffeeSort {
 Coffee("Kaffee") {
 @Override public ACoffee createCoffee() {
 ...
 }
 },
 Espresso("Espresso") { ... },
 Mocca("Mocca") { ... },
 Cappuccino("Cappuccino") { ... },
 LatteMacchiato("Latte Macchiato") { ... },
 **************("doppelter Espresso") { ... };

 private final String stringValue;

 private CoffeeSorts(final String s) {
 stringValue = s;
 }

 @Override
 public String toString() {
 return stringValue;
 }

 public abstract ACoffee createCoffee();
}


type вашего switch(type) должен быть объектом типа CoffeeSorts. Вы передаете строку.


Ваша подпись метода должна быть:

public ACoffee createCoffee(CoffeeSorts type)

Оператор switch работает по type а аргументы case, которые вы там ставите, имеют смысл только в том случае, если type типа CoffeeSorts.

Sidenote: перечисления обычно заглавные на Java (см. Соглашения о кодировании - Имена имен).

licensed under cc by-sa 3.0 with attribution.