Tiene método estático devuelve la misma instancia para el mismo argumento de cadena

user842225:

Tengo una TrafficMonitorclase, dentro de la clase, no tengo un método estático fábrica para devolver una instancia de esta clase:

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);
   }

}

No quiero que la TrafficMonitorde ser un producto único en general. Pero dentro del método de fábrica estática forBus(String busNumber), me gustaría asegurarse de que la misma instancia de TrafficMonitores cambio de la misma busNumber. Eso es "Singleton" per busNumber. ¿Cómo lograrlo?

Por ejemplo siguiente código debe utilizar la misma instancia de TrafficMonitor:

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

Después de código debe utilizar diferentes casos de TrafficMonitor:

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

Y yo quiero tener el método de fábrica estática sea seguro para hilos también. Eso, si dos subprocesos llaman para el mismo número de autobuses, dos hilos deben utilizar la misma instancia también.

John Kugelman:

Añadir instancias de un mapa estático. Utilizar computeIfAbsentpara devolver la instancia existente si la clave ya existe o crear uno nuevo si no lo hace.

A ConcurrentMapgarantiza la seguridad hilo.

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

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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=330756&siteId=1
Recomendado
Clasificación