java - 使用静态修饰符跟踪对象实例

标签 java android static instance

我目前正在编写一个 Android 应用程序,我有一个关于何时使用静态方法/字段的更高级别的问题。

我的应用程序跟踪不同 Activity 的时间使用情况,每个 Activity 都是一个类的实例。我需要一个可以返回此类的所有实例的方法。

像这样在我的 Activity 类中放置一个静态方法/字段是不是糟糕的设计:

static ArrayList<Activity> allInstances;    
public static void addToComprehensiveList(Activity a) {
    if(allInstances == null)
        allInstances = new ArrayList<Activity>();
    allInstances.add(a);
}
public static ArrayList<Activity> getComprehensiveList() {
    return allInstances;
}

此处正确的设计选择是什么?

最佳答案

保留实例的静态列表是一件相当安全且正常的事情。主要问题与向列表添加项目有关。

例如,如果 Activity 有一个在启动时调用 addToComprehensiveList(this) 的重要构造函数,那么有时未完全初始化的对象位于可公开访问的列表。如果您的程序是单线程的,这并不太危险 - 除非构造函数稍后抛出异常,在这种情况下,对象将以未完全初始化的状态留在列表中。

解决此问题的一种安全方法是在工厂方法中创建实例,该方法在创建对象后将其添加到列表中。当然,如果没有子类,只需将其添加到列表中作为构造函数中的最后一条语句即可。

这里的另一个危险是 getComprehensiveList() 返回对其实例列表的引用,这意味着客户端代码可能会在您的类不知情的情况下修改该列表。即使客户端只是遍历列表,如果您在他们的迭代期间创建一个新的 Activity,您也会得到商品化异常。更安全的方法是返回列表的副本。

关于java - 使用静态修饰符跟踪对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13983292/

相关文章:

java - Spring 3 在所有模型属性上错误地绑定(bind)请求数据

Java 列表排序 : Is there a way to keep a list permantly sorted automatically like TreeMap?

java - 如何将JPA查询结果映射到POJO?

android - 我应该为我的应用程序使用 fragment 或 Activity 吗?

Android 谷歌地图路径在缩放期间消失

java - 带有 CDI 的 DeltaSpike 自定义 ConfigSource

java - Android - 检查 Runnable 是否正在运行

java - 我应该使用静态方法还是静态字段

html - 我想在 Express.js 中渲染静态 html,但仍然有 app.get() 逻辑方法

c++ - 调用构造函数之前是否初始化了静态成员?