Estoy buscando diferentes formas de garantizar que cada instancia de una clase determinada sea una instancia identificable de forma única.
Por ejemplo, tengo una Nameclase con el campo name. Una vez que tengo un Nameobjeto nameinicializado a John Smith, no quiero poder crear una instancia de un Nameobjeto diferente también con el nombre de John Smith, o si se produce una instanciación, quiero que se devuelva una referencia al objeto original. que un nuevo objeto
Soy consciente de que una forma de hacerlo es tener una fábrica estática que contenga Maptodos los objetos de Nombre actuales y la fábrica verifica que un objeto con John Smith como nombre ya no exista antes de devolver una referencia a un Nameobjeto.
Otra forma de pensar en la parte superior de mi cabeza es tener un Mapa estático en la Nameclase y cuando se llama al constructor lanzando una excepción si el valor pasado nameya está en uso en otro objeto, sin embargo, soy consciente de lanzar excepciones en un constructor es generalmente una mala idea .
¿Hay otras formas de lograr esto?
fuente

I'm aware that one way of doing this is to have a static factory that holds a Map...Entonces, ¿por qué no quieres hacerlo de esta manera?Respuestas:
En realidad ya has respondido tu pregunta. Su primera forma debería ser más efectiva aquí. Usar
static factoryes siempre preferible queconstructordonde creas que puedes. Por lo tanto, puede evitar el usoConstructoren este caso, de lo contrario lo haríathrow some exceptionsi ya existiera una instancia con el nombre dado.Por lo tanto, puede crear un método de fábrica estático:
getInstanceWithName(name)que obtendrá la instancia ya disponible con ese nombre, y si no existe, creará una nueva instancia y la haráconstructorprivada, como debería hacerse principalmente cuando se trata destatic factories.Además, para eso necesita mantener una estática
ListoMapde todas las instancias únicas creadas, en suFactoryclase.EDITAR : -
Sin duda, debe pasar por: Java efectivo: elemento n. ° 1: considere las fábricas estáticas sobre los constructores . No se puede obtener una mejor explicación que ese libro.
fuente
Las menciones de Java efectivo parecen agregar mucha credibilidad, por lo que esta respuesta se basa en:
Daría un paso atrás y le preguntaría por qué le importa si hay más de una instancia de este objeto de nombre.
Raramente necesito hacer este tipo de agrupación de objetos. Supongo que el OP está haciendo esto para que simplemente puedan comparar sus
Nameobjetos==. O use losNameobjetos dentro de aHashMapo similar como la clave.Si es así, esto es algo que se puede resolver mediante la implementación adecuada de
equals().Al igual que:
Una vez hecho esto, lo siguiente es cierto:
Supongo que su objetivo, pero de esta manera puede usar la
Nameclase en mapas hash, etc., y no tienen que ser exactamente la misma instancia.fuente
Nameuna interfazNameFactorycon un métodoName getByName(String)NameFactorycon unMap<String,WeakReference<Name>>interiorsynchronizeen el mapa por nombre dentro delgetByNamemétodo antes de hacer nuevas instancias deNameNameinterfaz dentro de su implementación delNameFactoryEste enfoque le permitiría asegurarse de que:
Nameexiste una única instancia de en cualquier momento,Namequedan más tiempo del necesario,fuente
throwexiste un nombre idéntico en lugar de devolver un objeto, o si devuelve unnullobjeto.destructorsería útil.debe hacer que los constructores sean privados y crear métodos como
getNameInstance(String), si un objeto con el mismo nombre ya existe (basado en una clase estática 'hastable por ejemplo), devuelve esa referencia, de lo contrario, crea un nuevo objeto usando su constructor privado y lo agrega a la tabla hashfuente
Intenta seguir. Debe realizar un seguimiento de cada objeto que cree. Para este propósito estoy usando List. E hizo que el constructor de clases fuera privado, de modo que la verificación previa se pueda aplicar antes de crear una instancia
fuente
List. Esto sería una buena opción paraDictionary<string,UniqueName>.