gpt4 book ai didi

java - 让静态方法为相同的字符串参数返回相同的实例

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:59:39 24 4
gpt4 key购买 nike

我有一个 TrafficMonitor 类,在这个类中,我有一个工厂静态方法来返回这个类的一个实例:

public class TrafficMonitor {
private String busNumber;
//private constructor
private TrafficMonitor(String busNumber) {
this.busNumber = busNumber;
}

// static factory method to return a instance of this class
public static TrafficMonitor forBus(String busNumber) {
// how to make sure one instance per busNumber???
return new TrafficMonitor(busNumber);
}

}

我不希望 TrafficMonitor 整体上是一个单例。但是在静态工厂方法 forBus(String busNumber) 中,我想确保为相同的 busNumber 返回相同的 TrafficMonitor 实例.这是每个 busNumber 的“单例”。如何实现?

例如,下面的代码应该使用相同的 TrafficMonitor 实例:

// monitor1 and monitor2 are referring to the same instance
TrafficMonitor monitor1 = TrafficMonitor.forBus("123");
TrafficMonitor monitor2 = TrafficMonitor.forBus("123");

以下代码应使用不同的 TrafficMonitor 实例:

// monitor1 and monitor2 are two different instances
TrafficMonitor monitor1 = TrafficMonitor.forBus("123");
TrafficMonitor monitor2 = TrafficMonitor.forBus("456");

而且我希望静态工厂方法也是线程安全的。也就是说,如果两个线程为相同的总线号调用它,那么两个线程也应该使用相同的实例。

最佳答案

将实例添加到静态 map 。使用 computeIfAbsent如果 key 已经存在则返回现有实例,如果不存在则创建一个新实例。

A ConcurrentMap确保线程安全。

private static ConcurrentMap<String, TrafficMonitor> instances = new ConcurrentHashMap<>();

public static TrafficMonitor forBus(String busNumber) {
return instances.computeIfAbsent(busNumber, TrafficMonitor::new);
}

关于java - 让静态方法为相同的字符串参数返回相同的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58364755/

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