Java 让静态方法为相同的字符串参数返回相同的实例
我有一个Java 让静态方法为相同的字符串参数返回相同的实例,java,Java,我有一个TrafficMonitor类,在该类中,我有一个工厂静态方法来返回该类的实例: public class TrafficMonitor { private String busNumber; //private constructor private TrafficMonitor(String busNumber) { this.busNumber = busNumber; } // static factory method to ret
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(stringbusnumber)
中,我想确保同样的TrafficMonitor
实例返回给同样的busNumber
。这是每个busNumber
的“单例”。如何实现
例如,以下代码应使用相同的TrafficMonitor
:
// monitor1 and monitor2 are referring to the same instance
TrafficMonitor monitor1 = TrafficMonitor.forBus("123");
TrafficMonitor monitor2 = TrafficMonitor.forBus("123");
// monitor1 and monitor2 are two different instances
TrafficMonitor monitor1 = TrafficMonitor.forBus("123");
TrafficMonitor monitor2 = TrafficMonitor.forBus("456");
以下代码应使用不同的流量监视器实例
:
// monitor1 and monitor2 are referring to the same instance
TrafficMonitor monitor1 = TrafficMonitor.forBus("123");
TrafficMonitor monitor2 = TrafficMonitor.forBus("123");
// monitor1 and monitor2 are two different instances
TrafficMonitor monitor1 = TrafficMonitor.forBus("123");
TrafficMonitor monitor2 = TrafficMonitor.forBus("456");
我希望静态工厂方法也是线程安全的。如果两个线程为相同的总线号调用它,那么两个线程也应该使用相同的实例。将实例添加到静态映射。如果密钥已存在,则使用返回现有实例;如果密钥不存在,则使用创建新实例 确保线程安全
private static ConcurrentMap<String, TrafficMonitor> instances = new ConcurrentHashMap<>();
public static TrafficMonitor forBus(String busNumber) {
return instances.computeIfAbsent(busNumber, TrafficMonitor::new);
}
私有静态ConcurrentMap实例=新ConcurrentHashMap();
总线的公共静态流量监视器(字符串总线号){
返回instances.computeIfAbsent(总线号,流量监视器::新建);
}
如果在Android中也能找到Java 7解决方案的答案,那就太好了。