Tuesday, February 3, 2015

Простая реализация консольного меню на Java

Предисловие

Часто во время разработки нужно сделать консольное меню. Это может быть утилита для пользы проекта, проверка какого-нибудь концепта или свой небольшой проект по ознакомлению с новой технологией. И вот когда я в 10-ый раз начал писать меню, я остановился и задумался: а может просто вынести это всё в библиотеку, да и пусть валяется в локальном репозитории maven'а? Сказано - сделано.


Реализация

Основа меню - это абстрактный класс MenuEntry. У него есть единственное поле title, а также абстрактный метод run.
public abstract class MenuEntry {
    private String title;

    public MenuEntry(String title) {
        this.title = title;
    }

    public abstract void run();
}
Это позволит нам описать, что должно произойти при выборе этого пункта меню, не заморачиваясь на создании новых классов, как это происходит при разработке с паттерном Команда (Command). Например, вот так:
new MenuEntry("Entry Name") {
    @Override
    public void run() {
        someStuff();
    }
}
Теперь нужен только какой-нибудь контейнер, который будет в хранить все пункты меню и выводить их в бесконечном цикле. Этим будет заниматься класс Menu. В качестве дополнения, он будет автоматически создавать пункт меню Exit и добавлять его в конец списка.
public class Menu {
    private List entries = new ArrayList();
    private boolean isExit = false;

    public Menu() {
        // Добавляем пункт меню Exit
        entries.add(new MenuEntry("Exit") {
            @Override
            public void run() {
                isExit = true;
            }
        });
    }

    public void run() {
        // Бесконечный цикл, пока не нажали кнопку выход
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        while (!isExit) {
            printMenu();
            try {
                String line = reader.readLine();
                int choice = Integer.parseInt(line);
                // Выбираем нажатый пункт меню и выполняем его код
                MenuEntry entry = entries.get(choice - 1);
                entry.run();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
Ну а вот пример того, как это всё добро можно использовать:
Menu menu = new Menu();
menu.addEntry(new MenuEntry("test1") {
    @Override
    public void run() {
        System.out.println("test1 run");
    }
});
menu.addEntry(new MenuEntry("test2") {
    @Override
    public void run() {
        System.out.println("test2 run");
    }
});
menu.run();

Ссылки

Исходники можно посмотреть на github
Удачного кодинга!


1 comment: