java - 让静态方法为相同的字符串参数返回相同的实例
问题描述
我有一个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)
中,我想确保相同的实例TrafficMonitor
返回相同busNumber
。那是每个“单身人士” 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");
而且我想让静态工厂方法也是线程安全的。也就是说,如果两个线程为相同的总线号调用它,则两个线程也应该使用相同的实例。
解决方案
将实例添加到静态地图。如果键已存在,则用于computeIfAbsent
返回现有实例,如果不存在则创建一个新实例。
AConcurrentMap
确保线程安全。
private static ConcurrentMap<String, TrafficMonitor> instances = new ConcurrentHashMap<>();
public static TrafficMonitor forBus(String busNumber) {
return instances.computeIfAbsent(busNumber, TrafficMonitor::new);
}
推荐阅读
- audio - 通过 websocket 从麦克风流式传输音频。我可以看到正在发送的数据,但在接收客户端听不到它
- javascript - 从子组件传递数据时,父状态不更新
- linux - 命令行在哪里搜索可执行程序
- javascript - 在全局上下文中使用类方法具有未定义的“this”
- json - 使用 Spark 访问嵌套在结构中的 json 数组
- filter - 是否可以仅保留对公共 Google 表格客户端的更改?
- css - 当左侧有很多内容时,防止 CSS 将节点包裹在其最大宽度以下的树中,例如思维导图
- unity3d - 如何使对象的参考框架位于其尖端而不是其中心(Unity3d)?
- postman - 在邮递员收集运行中禁用请求
- batch-file - 批处理文件可以做到这一点吗?