【发布时间】:2013-02-19 16:59:57
【问题描述】:
我正在开发计算机视觉应用程序,我需要分类器类。此类在每次运行应用程序时都是不可变的,它会在初始化时从磁盘加载经过训练的数据。我想确保整个程序都可以访问相同的训练数据,并且我想在加载后阻止从磁盘重新加载。
我考虑的是使用静态类或单例。我不确定如何将数据加载到静态类,因为在编译时不知道数据文件的路径 - 这将是程序参数。所以我在想单例模式,但是我不知道如何动态初始化它。
我的想法是使用以下内容:
class Singleton {
private static Singleton instance;
private Singleton() { ... }
private static SomeDataObject data;
public static Singleton getInstance() {
if(instance == null)
instance = new Singleton();
return instance;
}
public static init(string dataPath){
if(data == null)
loadDataFromFile(dataPath)
}
}
这行不通,因为我无法控制首先调用哪个方法。
我知道正确的方法是在开始时使用数据创建实例并将其传递给所有需要它的类和方法,但这并不是真正的通用解决方案。我可以在自己的代码中跟踪对 Classifier 的所有调用,但如果我将代码作为 API,这将是一个问题。
简而言之如何在运行时初始化单例?
【问题讨论】:
-
程序参数
dataPath如何以编程方式访问? -
您不需要both 静态单例实例和 数据对象。此外,您当前的单例实现不是线程安全的。
-
@MattBall 它可以来自 GUI,也可以来自命令行参数
-
首先,你需要确定你需要使用单例模式。当您需要 > 确保只创建一个类的一个实例时,应使用单例。 提供对对象的全局访问点。 oodesign.com/singleton-pattern.html 看来你不需要Singleton。全局变量不好,单例也是。
-
@bancer 我需要 SomeDataObject 的单个实例可访问,并且该实例应该可由多种其他类型的分类器访问,而不需要共享某些父类。
标签: java oop singleton design-patterns