gpt4 book ai didi

java - 带参数的单例类

转载 作者:搜寻专家 更新时间:2023-10-31 19:40:03 25 4
gpt4 key购买 nike

我正在开发计算机视觉应用程序,我需要分类器类。此类在每次应用程序运行时都是不可变的,它会在初始化时从磁盘加载经过训练的数据。我想确保整个程序都可以访问相同的训练数据,并且我想在加载数据后阻止从磁盘重新加载。

我正在考虑的是使用静态类或单例。我不确定如何将数据加载到静态类,因为在编译时不知道数据文件的路径——它将是程序参数。所以我在想单例模式,但我不知道如何动态初始化它。

我的想法是使用以下内容:

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)
}
}

这将不起作用,因为我无法控制首先调用哪个方法。

我知道正确的方法是在开始时使用数据创建实例并将其传递给所有需要它的类和方法,但这并不是真正的通用解决方案。我可以在我自己的代码中跟踪所有对分类器的调用,但如果我将代码作为 API,这将是一个问题。

简而言之如何在运行时初始化单例?

最佳答案

我不认为(确切地)你想做的事会奏效。

以下将起作用:

public static void main(String[] args)
{
Singleton.init("somepath");
...
Singleton.getInstance().doingStuff();
...
}

更好的实现可能是:(如果您尝试在不先调用 init 的情况下使用它,这将导致 NullPointerException)(尽管不再是真正的 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;
}
}

我想这并没有真正解决多少问题。

关于java - 带参数的单例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14963137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com