В настоящее время я использую следующий шаблон командной строки.
- Я подумал, что код мог бы быть лучше, если бы вместо типа
Class<? extends Command>>
использовался просто Command
. Однако я не уверен, как настроить последнюю часть кода. command = model.newInstance();
- Есть ли в этом коде что-нибудь, что можно улучшить?
private static final Map<Pattern, Class<? extends Command>> COMMAND_PACKAGE
= new HashMap<Pattern, Class<? extends Command>>() {
{
put(SampleCommand.getDefaultPattern(), SampleCommand.class);
...
}
};
private static Class<? extends Command> getFromDefaultPackage(final String input) {
// This lambda searches for the first entry in the hash map that has a regex pattern that matches the input.
// If none was found it returns null.
// This kind of kills me all advantages of a hash map when it comes to speed.
return COMMAND_PACKAGE.keySet()
.stream()
.filter(s -> s.matcher(input).matches())
.findFirst()
.map(COMMAND_PACKAGE::get)
.orElse(null);
}
...
final Command command;
Class<? extends Command> model = getFromDefaultPackage(input);
try {
command = model.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
// This should never happen – when this code is reached the program terminates.
throw new AssertionError("The commands are implemented incorrectly. This is a bug.");
}