Java 我是否应该对员工工资单控制台系统中的菜单类使用静态方法?

Java 我是否应该对员工工资单控制台系统中的菜单类使用静态方法?,java,arrays,static,Java,Arrays,Static,我的程序是一个小程序,它有一个employee类和另一个Menu类,用于操纵控制台程序中的雇员数组。菜单类的方法是否应该声明为静态的 这些方法的一些示例有addEmployee、updateEmployee和ShowEmployee。每个employee对象都存储在Employees数组中,许多其他方法将使用该数组,例如通过传入数组来显示所有员工 如果这些方法被声明为静态的,那么我所要做的就是将数组传递到静态方法中,如下所示 Employee[] employees = new Employee

我的程序是一个小程序,它有一个employee类和另一个Menu类,用于操纵控制台程序中的雇员数组。菜单类的方法是否应该声明为静态的

这些方法的一些示例有addEmployee、updateEmployee和ShowEmployee。每个employee对象都存储在Employees数组中,许多其他方法将使用该数组,例如通过传入数组来显示所有员工

如果这些方法被声明为静态的,那么我所要做的就是将数组传递到静态方法中,如下所示

Employee[] employees = new Employee[50];
Menu.showEmployees(Employees);
//other example methods that manipulate the array
Menu.methodX(Employees);
Menu.methodY(Employees);
Menu.methodZ(Employees);
但是,如果不是静态的,我想为Menu类提供一个构造函数,该构造函数将接受employees数组,之后Menu对象可以直接将数组作为其成员进行操作:

Employee[] employees = new Employee[50];
Menu menu1 = new Menu(Employees);
menu1.showEmployees();
//other example methods that manipulate the array
menu1.methodX();
menu1.methodY();
menu1.methodZ();

我知道静态方法只能用作实用方法,但有时如果方便且系统不打算扩展,可以使用静态方法。在这种情况下,哪一种做法更好?

静态方法对于调用不需要状态的类上的函数很有用。最古老的例子是
Integer.parseInt
;我们不需要
整数的实例来将
字符串
解析为
int


如果您发现自己将状态反复传递给静态函数,那么使用实例比使用所有静态函数/变量更明智。特别是在这种情况下,由于您的操作完全依赖于状态,因此使用静态函数没有什么意义。

亲爱的,我认为,如果您指定任何静态方法,您应该使用static…bcz…您不需要创建类的对象来调用该方法。。您可以使用(class_name.method_name)直接调用它。它可以节省创建对象时所浪费的内存。这两种方法都是正确的……但我必须告诉另一件事,在java菜单中,类是一个静态类。。。所以你必须使用静态关键字来定义方法

…方法的一些示例包括addEmployee、updateEmployee和 展示员工。每个employee对象都存储在Employees数组中, 它将被许多其他方法使用,例如显示所有 通过在数组中传递

以下是一般规则:

避免全局状态

全局状态使您的程序脆弱、不安全,并且难以维护。全局状态是封装的反命题(它描述了数据隐藏在模块化、解耦单元中的原理)

全局状态主要由类的静态实例字段组成。遵循上述规则,问题的答案取决于数据模型的定义方式:

  • 静态实例字段中存储的员工数据。在这种情况下,静态员工方法将能够直接访问和修改静态员工数据。但是,您不应该这样做。这是个糟糕的设计。任何可以访问类的代码都可以访问和更改员工数据,从而导致安全问题、一致性问题和维护问题

  • 存储在非静态实例字段中的员工数据。在这种情况下,静态方法无法直接访问非静态员工数据。要解决此问题,可以将对要修改的实例的引用作为参数传递给该方法。仍然可能存在并发问题,在多线程设计中需要考虑这些问题。这种设计具有更好的封装性,应该不那么脆弱,更安全

最好的设计是仔细构造一个域对象模型。您的目标应该是让每个模块封装所有状态以及在该状态下运行的行为。通过这种方式,您应该发现您的目标可以在没有那么多静态方法的情况下实现。作为一个好处,您的程序将包含解耦的模块,这些模块可以独立发展,更易于维护,并且更安全

事实上,您有一个菜单类,这表明您的设计可能是次优的。菜单与员工没有明显的关系;菜单上有一个雇员,这并没有直观的意义。您的类可能没有像可能的那样解耦