我的程序是一个小程序,它有一个员工类和另一个Menu类,用于操作控制台程序中的一组员工。 Menu类的方法应该声明为static吗?
这些方法的一些示例是addEmployee,updateEmployee和showEmployees。每个员工对象都存储在Employees数组中,该数组将被许多其他方法使用,例如通过传入数组来显示所有员工。
如果方法声明为static,那么我所要做的就是将数组传递给静态方法,例如
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数组,之后菜单对象可以直接操作数组作为其成员:
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();
我知道静态方法应该仅用作实用程序方法,但是如果方便且系统不打算扩展,有时可以使用静态方法。在这种情况下哪种做法更好?
答案 0 :(得分:0)
静态方法对于调用不需要状态的类的函数很有用。最值得尊敬的例子是Integer.parseInt
;我们不需要Integer
的实例将String
解析为int
。
如果您发现自己反复将状态传递给静态函数,那么使用实例而不是全静态函数/变量是一个更明智的举动。特别是在这种情况下,由于您的操作绝对做取决于状态,因此使用静态函数毫无意义。
答案 1 :(得分:0)
...这些方法的一些例子是addEmployee,updateEmployee和 showEmployees。每个员工对象都存储在Employees数组中, 这将被许多其他方法使用,例如显示所有方法 员工通过传递数组。
这是一般规则:
避免全球状态。
全球状态使您的程序变得脆弱,不安全且难以维护。全局状态是封装的反论点(它描述了数据隐藏在模块化,解耦单元内的原理)。
全局状态主要由类的静态实例字段组成。遵守上述规则,您的问题的答案取决于您的数据模型的定义方式:
存储在静态实例字段中的员工数据。在这种情况下,您的静态员工方法将能够直接访问和修改静态员工数据。但是,你不应该这样做。这是糟糕的设计。任何有权访问您的类的代码都可以访问和更改员工数据,从而导致安全问题,一致性问题和维护问题。
存储在非静态实例字段中的员工数据。在这种情况下,您的静态方法无法直接访问非静态员工数据。要解决此问题,您可以将对要修改的实例的引用作为参数传递给方法。仍然可能存在并发问题,需要在多线程设计中考虑这些问题。这种设计具有更好的封装性,应该更不易碎,更安全。
最好的设计是仔细构建域对象模型。您的目标应该是让每个模块封装所有状态以及在该状态下运行的行为。通过这种方式,您应该发现您的目标可以在没有多少静态方法的情况下完成。作为一个好处,您的程序将包含分离的模块,可以独立发展,更易于维护,更安全。
您有一个菜单类的事实表明您的设计可能不是最理想的。菜单与员工没有明显的关系;它不会使一个菜单 - 员工 - 具有直觉意义。你的课程可能不像他们那样脱钩。
答案 2 :(得分:-2)
我想,亲爱的,你应该使用static ... bcz如果你指定任何方法静态...你不需要创建类的对象来调用方法..你可以使用(class_name)直接调用它.method_name)...它节省了创建对象所浪费的内存。两种方法都是正确的......但是我必须告诉另一件事,在java Menu类中是一个静态类。 ...所以你必须对方法使用静态关键字