Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 让静态方法为相同的字符串参数返回相同的实例_Java - Fatal编程技术网

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解决方案的答案,那就太好了。