我有一个带有基于文本的用户菜单的小程序。一个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);
}
}
答案 0 :(得分:1)
但是要切换回上一个菜单,我总是创建一个新类的实例并调用第一个方法来显示第一个菜单。
您不是每次都创建新实例。您在main
中创建了一个实例,就是这样。话虽如此,你做了一些奇怪的设计选择。
您有一个UserInterface
类,可以根据上下文打印一些文本。两个一般设计是:
静态方法(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(); }
}
实例方法
public class UserInterface {
public static void main(String[] args) {
UserInterface userInterface = new UserInterface();
userInterface.showDefaultInterface();
}
private void showDefaultInterface() {
// ...
showArtikelInterface();
// ...
}
private void showArtikelInterface() {
// ...
showDefaultInterface();
// ...
}
}
但是你有一个混合,你将实例传递给自己没有意义:
UserInterface userInterface = new UserInterface();
userInterface.showDefaultInterface(userInterface);
与showArtikelInterface
方法相同。一个实例可以访问自己,所以没有理由在你的情况下这样做(实例方法将采用其类型的实例的情况可以在你有链/链接/节点的数据结构中......)。
另一个奇怪的事情是你的while
条件
while (scanner.nextInt() != 5); // and the other one
应该是> 5
和< 1
。虽然我想这只是你目前的测试代码。
最后一件事是你可以在方法之间共享Scanner
对象,而不是每次都创建一个。{1}}对象。根据您的设计选择,将其推广到某个字段(static
或不是{。}}。