我正在构建一个Java应用程序。我有一个名为Application的类,它包含用户对象和组对象的arraylists。在用户和组类中,一些方法(例如向另一个用户发送消息)需要通过电子邮件,用户名或类Application中用户的arraylist中的其他字段来搜索另一个User对象。由于Application是容器类,因此我不想在包含的类Users或Groups中包含它的实例。
由于我将要有一个Application类的实例,我想将此类及其属性设置为静态,以便能够从类User和Group中访问搜索方法,但我也是不确定它是一个好主意还是正确使用静态类。你认为这是对的还是更好的选择?提前致谢
编辑*另一个选项是使用户和组的属性ArrayList成为静态,因为对于所有可能的Application实例,它们必须相同。你觉得那样更好吗?
答案 0 :(得分:1)
嗯,这看起来像singleton
模式问题。您在类中声明了一个static
字段,该字段包含该类的当前实例:
private static Application INSTANCE = null;
然后在一个方法中,您要么返回现有实例,要么创建一个新实例,这种方式总是存在一个:
public static Application getInstance(){
if(INSTANCE == null){
return new Application();
}
else return INSTANCE;
}
然后,使用此访问点,您可以调用static
方法(您可以,而无需先实例化该类):
Application app = Application.getInstance();
编辑:正如评论中所建议的那样,这类的构造函数应该是私有的,以防止不受控制的向外实例化(就像在多线程中一样)。
答案 1 :(得分:1)
使用具有静态变量和函数的final类是一种做事方式。但是打电话给这样一个班级"应用程序"可能不是最好的选择。
最终类允许您从所有其他类访问这些变量和/或函数,而无需创建多个实例来获取此静态数据。
但你应该考虑的是"静态"实际上数据是。如果部分变量不是那么静态,就像可能随着时间推移而增长的用户列表一样,那么最好只使用一个本身是静态的UserFactory并管理一个类用户和一个" arraylist [用户]用户"然后,您可以通过调用UserFactory.get(),set(),update()。
来使用它答案 2 :(得分:1)
如果您确定要实施单例申请,我建议您an enum singlton。
public enum Application {
INSTANCE;
private ArrayList<User> userList;
// Whatever other members your application should contain
}
但是,您应该知道,static
代码通常会破坏dependency injection设计模式,这会导致大规模应用程序出现sirius问题(请this Google's video了解有关依赖项的更多信息)注射与全球状态)。
并不是说static
代码总是坏的,但一般来说它应该保留给无状态实用程序方法或全局常量。
无论如何,如果你决定实现一个单一的,请尝试在整个应用程序中坚持使用一个。其他类将成为“singltons”如果你通过添加它们的字段将它们绑定到真正的singlton(你可以创建一个类型的monlton类的私有内部类型,以确保它不会从外部实例化,如果它有意义)。通过这种方式,您可以避免静态初始化顺序问题(单例依赖于彼此以及JVM初始化它们的顺序“神奇地”)。