我应该让我的类应用程序静态吗?

时间:2015-03-08 13:32:42

标签: java static-classes

我正在构建一个Java应用程序。我有一个名为Application的类,它包含用户对象和组对象的arraylists。在用户和组类中,一些方法(例如向另一个用户发送消息)需要通过电子邮件,用户名或类Application中用户的arraylist中的其他字段来搜索另一个User对象。由于Application是容器类,因此我不想在包含的类Users或Groups中包含它的实例。

由于我将要有一个Application类的实例,我想将此类及其属性设置为静态,以便能够从类User和Group中访问搜索方法,但我也是不确定它是一个好主意还是正确使用静态类。你认为这是对的还是更好的选择?提前致谢

编辑*另一个选项是使用户和组的属性ArrayList成为静态,因为对于所有可能的Application实例,它们必须相同。你觉得那样更好吗?

3 个答案:

答案 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初始化它们的顺序“神奇地”)。