То, что вы сделали, это, вероятно, лучший способ сделать это, пока не станет доступна строка включения.( Редактировать 2019: Доступно переключение на строку - используйте это.)
Вы можете создавать фабричные объекты и карту из строк в них.Но в современной Java это немного многословно.
private interface AnimalFactory {
Animal create();
}
private static final Map<String,AnimalFactory> factoryMap =
Collections.unmodifiableMap(new HashMap<String,AnimalFactory>() {{
put("Meow", new AnimalFactory() { public Animal create() { return new Cat(); }});
put("Woof", new AnimalFactory() { public Animal create() { return new Dog(); }});
}});
public Animal createAnimal(String action) {
AnimalFactory factory = factoryMap.get(action);
if (factory == null) {
throw new EhException();
}
return factory.create();
}
В то время, когда этот ответ был изначально написан, функции, предназначенные для JDK7, могли сделать код таким, как показано ниже.Как оказалось, лямбды появились в Java SE 8, и, насколько мне известно, планов литералов карт нет.( Отредактировано 2016 )
private interface AnimalFactory {
Animal create();
}
private static final Map<String,AnimalFactory> factoryMap = {
"Meow" : { -> new Cat() },
"Woof" : { -> new Dog() },
};
public Animal createAnimal(String action) {
AnimalFactory factory = factoryMap.get(action);
if (factory == null) {
throw EhException();
}
return factory.create();
}
Редактировать 2019: В настоящее время это будет выглядеть примерно так:
import java.util.function.*;
import static java.util.Map.entry;
private static final Map<String,Supplier<Animal>> factoryMap = Map.of(
"Meow", Cat::new, // Alternatively: () -> new Cat()
"Woof", Dog::new // Note: No extra comma like arrays.
);
// For more than 10, use Map.ofEntries and Map.entry.
private static final Map<String,Supplier<Animal>> factoryMap2 = Map.ofEntries(
entry("Meow", Cat::new),
...
entry("Woof", Dog::new) // Note: No extra comma.
);
public Animal createAnimal(String action) {
Supplier<Animal> factory = factoryMap.get(action);
if (factory == null) {
throw EhException();
}
return factory.get();
}
Если вы хотите добавитьпараметр, вам нужно переключить Supplier
на Factory
(и get
становится apply
, что также не имеет смысла в контексте).Для двух параметров BiFunction
.Более двух параметров, и вы снова пытаетесь сделать его читабельным.