在不创建新对象的情况下创建文本菜单的优化方法

时间:2016-10-02 21:22:31

标签: java user-interface optimization menu

我有一个带有基于文本的用户菜单的小程序。一个switch case正在为我做输入验证,因为用户只输入我验证的整数。

菜单如下所示:

----------------------
(1) Manage articles
(2) Manage customers
(3) Close
----------------------
Please enter your number:

此菜单是通过额外的方法创建的 当我输入1时,我调用另一个包含另一个do-while循环的方法,这次验证文章菜单等等。第二个菜单如下所示:

Manage articles
----------------------
(1) Show
(2) Add
(3) Change
(4) Delete
(5) Back
----------------------
Please enter your number:

但是要切换回上一个菜单,我总是创建一个新类的实例并调用第一个方法来显示第一个菜单。

结果是:当我在菜单之间多次切换时,我总是创建一个新的程序实例。

我认为有更好的方法可以进行这样的多层阅读,并希望知道如何在这里表现更好。

更新

package articlemanagement.menu;

import articlemanagement.model.Artikel;

import articlemanagement.verwaltung.ArticleManagement;

import java.util.LinkedList;
import java.util.Random;
import java.util.Scanner;

public class UserInterface {

    private ArticleManagement articleManagement;

    private UserInterface() {
        this.articleManagement = new ArticleManagement();
    }


    public static void main(String[] args) {
        UserInterface userInterface = new UserInterface();

        userInterface.showDefaultInterface(userInterface);

        System.out.println("See you next time!");
    }

    private void showDefaultInterface(UserInterface userInterface) {
        Scanner scanner = new Scanner(System.in);
        int input = 0;

        do {
            System.out.println("Welcome");
            System.out.println("----------------------");
            System.out.println("(1) Articles");
            System.out.println("(2) Customers");
            System.out.println("(3) Shop");
            System.out.println("(4) End");
            System.out.println("----------------------");
            System.out.print("Please enter a number:");

            input = scanner.nextInt();

            switch (input) {
                case 1:
                    userInterface.showArtikelInterface(userInterface);
                    break;
                case 2:
                    System.out.println("todo");
                    break;
                case 3:
                    System.out.println("todo");
                    break;
                case 4:
                    System.out.println("Bye");
                    break;
                default:
                    break;
            }

        } while (input != 4);

        System.exit(1);
    }

    /**
     * Show overview
     */
    private void showArtikelInterface(UserInterface userInterface) {
        Scanner scanner = new Scanner(System.in);

        do {
            System.out.println("Manage your articles");
            System.out.println("----------------------");
            System.out.println("(1) Show");
            System.out.println("(2) Add");
            System.out.println("(3) Modify");
            System.out.println("(4) Delete");
            System.out.println("(5) Go Back");
            System.out.println("----------------------");
            System.out.print("Bitte geben Sie eine Zahl für Ihr Menü ein:");

            int input = scanner.nextInt();

            switch (input) {
                case 1: // show
                    zeigeArtikel();
                    break;
                case 2: // add
                    System.out.println("todo");
                    break;
                case 3: // modify
                    System.out.println("todo");
                    break;
                case 4: // delete
                    System.out.println("todo");
                    break;
                case 5: // back
                    System.out.println("Going back...");
                    // bad style?
                    userInterface.showDefaultInterface(userInterface);
                    break;
                default:
                    break;
            }

        } while (scanner.nextInt() != 5);
    }
}

1 个答案:

答案 0 :(得分:1)

  

但是要切换回上一个菜单,我总是创建一个新类的实例并调用第一个方法来显示第一个菜单。

您不是每次都创建新实例。您在main中创建了一个实例,就是这样。话虽如此,你做了一些奇怪的设计选择。

设计

您有一个UserInterface类,可以根据上下文打印一些文本。两个一般设计是:

  1. 静态方法(utility / handler / manager ...)

    public class UserInterface {
    
        public static void main(String[] args) {
    
            UserInterface.showDefaultInterface();
        }
    
        private static void showDefaultInterface() {
    
            // ...
            showArtikelInterface();
            // ...
        }
    
        private static void showArtikelInterface() {
    
            // ...
            showDefaultInterface();
            // ...
        }
    }
    

    或者你可以创建一个类型来表示上下文,如果你需要更多的灵活性(似乎不是这样):

    interface Context {
    
        void show();
    }
    

    class UserInterface {
    
        static void showContext(Context context) { context.show(); }
    } 
    
  2. 实例方法

    public class UserInterface {
    
        public static void main(String[] args) {
    
            UserInterface userInterface = new UserInterface();
            userInterface.showDefaultInterface();
        }
    
        private void showDefaultInterface() {
    
            // ...
            showArtikelInterface();
            // ...
        }
    
        private void showArtikelInterface() {
    
            // ...
            showDefaultInterface();
            // ...
        }
    }
    
  3. 但是你有一个混合,你将实例传递给自己没有意义:

    UserInterface userInterface = new UserInterface();
    userInterface.showDefaultInterface(userInterface);
    

    showArtikelInterface方法相同。一个实例可以访问自己,所以没有理由在你的情况下这样做(实例方法将采用其类型的实例的情况可以在你有链/链接/节点的数据结构中......)。

    循环条件

    另一个奇怪的事情是你的while条件

    while (scanner.nextInt() != 5); // and the other one
    

    应该是> 5< 1。虽然我想这只是你目前的测试代码。

    共享资源

    最后一件事是你可以在方法之间共享Scanner对象,而不是每次都创建一个。{1}}对象。根据您的设计选择,将其推广到某个字段(static或不是{。}}。