Как стать автором
Обновить

Комментарии 17

А если как-то так?

switch(stringVar.hashCode()) {
case «RequestOne».hashCode(): scenarioOne(); break;
case «RequestTwo».hashCode(): scenarioTwo(); break;
case «RequestThree».hashCode(): scenarioThree(); break;
}
О да, прекрасный способ словить баг на ровном месте :-)
Да какой там баг. Это не баг, так просто нельзя делать принципиально :)
jdk7 негодует
а вообще да, решение имеет право на существование для старых версий jdk.
Да нет никакой проблемы. Всю жизнь через enum делали…
Автор решил за КО поработать…
поддерживаю, эта очевидная Америка давно открыта
Вы меня конечно извините, но в чем смысл писать конструкции вида — «case SCENARIO_ONE: scenarioOne(); break;». Это для экономии места чтобы в одном методе больше операторов на один экран помещалось? Просто обычно принято оператор = новая строка, так читать код проще.

Также довольно сомнителен выигрыш от enum, это просто вопрос привычки как лучше писать. У нас пишут на ifelse и не жужжат, так всем проще и понятнее.

И напоследок о производительности и добавлении новых типов обработчиков: а почему бы не использовать Map<String, ICommand>? И динамически добавлять новые команды на лету?
Я с вами полностью согласен на счет if..else и сам стараюсь пользоваться в основном такими конструкциями. Но данное решение сделало человека счастливым и я решил написать про это. Возможно это кому-то понравится. Ну очень уж сильно хотелось ему использовать switch.

Понятно, что в данном случае вопрос производительности встает остро для больших enum.
Map<String, Command> может помочь, но тогда весь код придется раскидывать по методам, в case же можно писать несколько строк кода не заворачивая все это в отдельный метод.

По поводу конструкции вида «case SCENARIO_ONE: scenarioOne(); break;» — привычка, когда вызывается только один метод внутри case.
Спасибо за отзыв.
НЛО прилетело и опубликовало эту надпись здесь
Согласен, лишнее. Поправил.
насчет этого места:
static public RequestType getType(String pType) {
	for (RequestType type: RequestType.values()) {
		if (type.getTypeValue().equals(pType)) {
			return type;
		}
	}
	throw new RuntimeException("unknown type");
}


для String -> Enum есть спец. метод:
public static RequestType getType(String pType) {
	return RequestType.valueOf(pType);
}
Будет работать только в случае, если я передам в качестве pType: «SCENARIO_ONE», «SCENARIO_TWO», «SCENARIO_THREE». Но никак не «RequestOne», «RequestTwo»…
НЛО прилетело и опубликовало эту надпись здесь
Спасибо за комментарий, но я еще раз повторю, что в данном случае это работать не будет.

public static <T extends Enum> T valueOf(Class enumType, String name)
Returns the enum constant of the specified enum type with the specified name. The name must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.)

Для простейшего случая pType == 'Hello' и типа RequestType.HELLO — это будет работать, но я отметил возможность обрабатывать любые строки.
НЛО прилетело и опубликовало эту надпись здесь
Я хотел этим сказать, что valueOf применимо для случаев, когда pType полностью соответствует значению типа. По моему это очевидно. А что если я захочу, чтобы на значение «hello_my_name_is_vasya_bla_bla_bla» возвращался тип RequestType.VASYA, а не RequestType.HELLO_MY_NAME_IS_VASYA_BLA_BLA_BLA"

PS. Случайно нажал плюс на ваш комментарий, считаю его бесполезным. Это вы пытаетесь проявить впечатление на других, я лишь показал свой вариант решения конкретной проблемы.
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории