Я хочу записать приложения, который принимает пользовательскую команду. Пользовательская команда используется в этом формате:
команда - параметр
Например, приложение может иметь "Копию", "Вставку", команду "Delete", я думаю, программа должна работать как это:
public static void main(String args[]){
if(args[0].equalsIgnoreCase("COPY")){
//handle the copy command
} else if(args[0].equalsIgnoreCase("PASTE")){
//handle the copy command
}/**
code skipped
**/
}
Так, это работает, но я думаю, что это станет все более сложным, когда у меня будет больше команды в моей программе, также, это отличается в чтение. Какие-либо идеи просто логике?
Если вас беспокоит обработка параметров командной строки , то для этого предназначен Commons CLI .
Просмотрите CommandLineParser
, и если вас беспокоит сложность вашего if-else , вы можете использовать шаблон команд
public interface Command {
void exec();
}
public class Copy implements Command {
void exec() {
// your copy Code
}
}
public class Paste implements Command {
void exec() {
// your Paste Code
}
}
public class Delete implements Command {
void exec() {
// your Delete Code
}
- {{ 1}} затем
public static void main(String args[]){
Map commandMap<String,Command> = new HashMap<String,Command>();
commandMap.put("Copy", new Copy());
commandMap.put("Paste", new Paste());
commandMap.put("Delete", new Delete());
if ( commandMap.containsKey(args[0]) ){
commandMap.get(args[0]).exec();
}
}
Используйте библиотеку, чтобы избежать беспорядка при синтаксическом анализе аргументов командной строки из вашего кода, например args4j .
В зависимости от того, насколько прост синтаксис вашей командной строки, простое enum
может быть вашим решением
public enum Command {
COPY {
@Override void execute() {
System.out.println("Copying...");
}
},
PASTE {
@Override void execute() {
System.out.println("Pasting...");
}
},
DELETE {
@Override void execute() {
System.out.println("Deleting...");
}
},
;
abstract void execute();
public static void main(String args[]) {
Command c = Command.valueOf(args[0].toUpperCase());
c.execute();
}
}
Скомпилируйте и запустите это с помощью java Command paste
, java Command bleh
и т.д. Вы захотите передать остальные args
в enum в вашем производственном коде. Кроме того, valueOf
бросает IllegalArgumentException
, если не найдена константа перечисления с указанным именем.
Однако если ваш синтаксис окажется более сложным, вы можете использовать библиотеки, специально разработанные для разбора командной строки, например, Apache Commons CLI.
Существует множество библиотек, которые могут справиться с этой ситуацией вместо того, чтобы записывать весь код.
Когда я вижу много кода if / then / else, я сразу думаю о полиморфизме как о возможном решении.
Командный интерфейс и карта были бы прекрасным способом решить эту проблему. Если бы я писал это на Java, это могло бы выглядеть так:
public interface Command<T, V>
{
V execute(T parameter) throws Exception;
}
Если ваши операции многопоточные, вы можете просто повторно использовать интерфейс Runnable для команд, которые не возвращают значение, и Callable
В любом случае, теперь ваша конструкция if / then / else является Map, где ключ - это имя, а значение - объект Command. Вы можете найти команду, указав ключ имени. Вы добавляете новую команду, записывая новую реализацию командного интерфейса и добавляя ее на карту. Инициализация карты - это то, что вы делаете при запуске. Вы даже можете экстернализовать его как конфигурацию, чтобы вам не пришлось изменять код для добавления новых (принцип открытости / закрытости).