jno*_*cho 5 java oop singleton design-patterns
我正在开发计算机视觉应用程序,我将需要Classifier类.这个类在每次运行时都是不可变的,它在初始化时从磁盘加载训练过的数据.我想确保整个程序可以访问相同的训练数据,并且我希望在加载后阻止从磁盘重新加载.
我考虑的是使用静态类或单例.我不确定如何将数据加载到静态类,因为在编译时不知道数据文件的路径 - 它将是程序参数.所以我在考虑Singleton模式,但我不知道如何动态初始化它.
我的想法是使用以下:
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,这将是一个问题.
简而言之,如何在运行时初始化单例?
我不认为(确切地)你想做什么会起作用.
以下将有效:
public static void main(String[] args)
{
  Singleton.init("somepath");
  ...
  Singleton.getInstance().doingStuff();
  ...
}
一个更好的实现可能是:( NullPointerException如果你尝试使用它而不init先调用它会导致一个)(虽然不是真正的Singleton)
private static Singleton instance;
private SomeDataObject data;
private Singleton(String path) { loadDataFromFile(path); ... }
public static Singleton getInstance() {
   return instance;
}
public static void init(String dataPath){
   instance = new Singleton(dataPath);
}
然后是:(可能不好编码的做法除外)
class Main
{
  public static void main(String[] args)
  {
    Singleton.currentPath = "somepath";
    ...
  }
}
class Singleton
{
  public static String currentPath = null;
  private static Singleton instance;
  private SomeDataObject data;
  private Singleton(String path) { loadDataFromFile(path); ... }
  public static Singleton getInstance() {
     if(instance == null && currentPath != null)
        instance = new Singleton(currentPath);
     return instance;
  }
}
我认为这并没有真正解决.