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

Should I make my class Application static?

我正在构建一个 Java 应用程序。我有一个名为 Application 的 class,它包含用户对象和组对象的数组列表。在 classes 用户和组中,某些方法(例如向另一个用户发送消息)需要通过电子邮件、用户名或 [=18 中用户数组列表中的其他字段搜索另一个用户对象=] 申请。由于应用程序是容器 class,我不想在包含的 classes 用户或组中包含它的实例。

因为我只需要一个应用程序实例 class,所以我想将此 class 及其属性设为静态,以便能够从 classes 用户和组,但我也不确定静态 classes 是个好主意还是正确使用。你认为这是对的还是有更好的选择?提前致谢

编辑* 另一种选择是将用户和组的属性 ArrayList 设为静态,因为它们对于应用程序的所有可能实例都必须相同。你觉得这样更好吗?

嗯,这看起来像是 singleton 模式问题。您在 class 中声明了一个 static 字段,它包含 class:

的当前实例
private static Application INSTANCE = null;

然后在一个方法中,您要么 return 现有实例,要么创建一个新实例,这种方式总是最多存在一个:

public static Application getInstance(){
    if(INSTANCE == null){
        return new Application();
    }
    else return INSTANCE;
}

然后,使用此访问点调用 static 方法(您可以调用该方法,而不必先实例化 class):

Application app = Application.getInstance();

编辑:正如评论中所建议的那样,class 的构造函数应该是私有的,以防止不受控制的外部实例化(就像在多线程中一样)。

使用具有静态变量和函数的 final classes 是一种处理方式。但是调用这样的 class "Application" 可能不是最好的选择。

Final classes 允许您从所有其他 classes 访问这些变量 and/or 函数,而无需创建多个实例来获取此静态数据。

但您应该考虑的是 "static" 数据的实际情况。如果部分变量不像可能随时间增长的用户列表那样静态,那么最好只使用例如本身是静态的 UserFactory 并管理 class 用户和 "arraylist[User] users" 然后你可以调用 UserFactory.get(), set(), update().

如果您确定要实现单例应用程序,我会推荐an enum singlton

public enum Application {
    INSTANCE;
    private ArrayList<User> userList;
    // Whatever other members your application should contain
}

但是,您应该知道,一般来说,static 代码会破坏 dependency injection design pattern, which can cause sirius problems in large scale applications (watch this Google's video 以了解有关依赖注入与全局状态的更多信息。

并不是说 static 代码总是不好的,但通常它应该保留给无状态实用程序方法或全局常量。

无论如何,如果您决定实施单例,请尝试在整个应用程序中只使用一个这样的单例。其他 classes 将变成 "singltons" 如果你通过添加它们作为它的字段将它们绑定到真正的单例(你可以使单例的类型私有内部类型 class 以确保它不是从外部实例化,如果有意义的话)。通过这种方式,您可以避免静态初始化顺序问题(单例相互依赖并且 JVM 初始化它们的顺序 "magically" 很重要)。