我目前正在编写一个 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/