gpt4 book ai didi

java - 将具有静态属性的 Singleton 更改为 Multiton

转载 作者:行者123 更新时间:2023-11-30 02:20:39 25 4
gpt4 key购买 nike

我有以下 Singleton 类

public class TestFileEngine {
private static int counter = 0;
private static List<GeneratedFile> generatedFileList;
private static Optional<TestFileEngine> engine = Optional.empty();

private TestFileEngine() {
generatedFileList = Collections.synchronizedList(new ArrayList<>());
}

public static synchronized TestFileEngine getInstance() {
if (!engine.isPresent()) {
engine = Optional.of(new TestFileEngine());
}

return ruEngine.get();
}

public synchronized void generateFile() {
counter++;
String timestamp = LocalDateTime.now().toString();
String content = "";//insert random content generation
GeneratedFile gf = new GeneratedFile(counter + ".txt", timestamp, content);
generatedFileList.add(gf);
System.out.println("Generated file " + counter + ".txt");
}

public GeneratedFile findFileByName(String filename) {
for (GeneratedFile file : generatedFileList){
if(file.getFileName().equals(filename)){
return file;
}
}
return null;
}
}

现在我想要有两个独立的引擎(将来可能会有更多),用于跟踪目的,我偶然发现了多吨模式,仍然使用惰性实现。所以我将更改以下内容:

//Getting rid of Optional, as it can get funky with Maps
private static final Map<String, TestFileEngine> _engines = new HashMap<String, TestFileEngine>();

public static synchronized TestFileEngine getInstance(String key) {
if (_engines.get(key) == null) {
_engines.put(key, new TestFileEngine());
System.out.println("Create engine " + key);
}else {
System.out.println("Using engine " + key);
}

return _engines.get(key);
}

我想确保每个引擎都有其单独的计数器和文件列表。但是,在我运行以下代码后,它们似乎共享计数器和列表:

TestFileEngine.getInstance("http").generateFile();
TestFileEngine.getInstance("http").generateFile();
TestFileEngine.getInstance("http").generateFile();
TestFileEngine.getInstance("ftp").generateFile();
TestFileEngine.getInstance("ftp").generateFile();

System.out.println(TestFileEngine.getInstance("http").findFileByName("4.txt").getFileName());
System.out.println(TestFileEngine.getInstance("ftp").findFileByName("2.txt"));

控制台:

Create engine http
Generated file 1.txt
Using engine http
Generated file 2.txt
Using engine http
Generated file 3.txt
Create engine ftp
Generated file 4.txt
Using engine ftp
Generated file 5.txt
Using engine http
4.txt
Using engine ftp
null

我应该如何处理 counter generatedFileList 字段,以便从 Multiton 创建的每个 TestFileEngine 完全分离?

最佳答案

实际上,您使用 static 修饰符声明了该类的 3 个字段:

private static int counter = 0;
private static List<GeneratedFile> generatedFileList;
private static final Map<String, TestFileEngine> _engines = new HashMap<String, TestFileEngine>();

static 字段在当前类的所有实例之间共享。
您希望将其用于 engines 字段。
但您不希望 counter generatedFileList 字段必须附加到 TestFileEngine 的特定实例。因此,让它们成为实例字段而不是静态

顺便说一句,int 字段默认值为 0,您应该避免使用 _ 作为变量的前缀,因为它不会影响变量的值。成为命名约定的一部分。
所以你可以写:

private int counter;
private List<GeneratedFile> generatedFileList;
private static final Map<String, TestFileEngine> engines = new HashMap<String, TestFileEngine>();

关于java - 将具有静态属性的 Singleton 更改为 Multiton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46935402/

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