Estoy buscando diferentes formas de garantizar que cada instancia de una clase determinada sea una instancia identificable de forma única.
Por ejemplo, tengo una Name
clase con el campo name
. Una vez que tengo un Name
objeto name
inicializado a John Smith, no quiero poder crear una instancia de un Name
objeto 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 Map
todos 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 Name
objeto.
Otra forma de pensar en la parte superior de mi cabeza es tener un Mapa estático en la Name
clase y cuando se llama al constructor lanzando una excepción si el valor pasado name
ya 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 factory
es siempre preferible queconstructor
donde creas que puedes. Por lo tanto, puede evitar el usoConstructor
en este caso, de lo contrario lo haríathrow some exception
si 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áconstructor
privada, como debería hacerse principalmente cuando se trata destatic factories
.Además, para eso necesita mantener una estática
List
oMap
de todas las instancias únicas creadas, en suFactory
clase.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
Name
objetos==
. O use losName
objetos dentro de aHashMap
o 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
Name
clase en mapas hash, etc., y no tienen que ser exactamente la misma instancia.fuente
Name
una interfazNameFactory
con un métodoName getByName(String)
NameFactory
con unMap<String,WeakReference<Name>>
interiorsynchronize
en el mapa por nombre dentro delgetByName
método antes de hacer nuevas instancias deName
Name
interfaz dentro de su implementación delNameFactory
Este enfoque le permitiría asegurarse de que:
Name
existe una única instancia de en cualquier momento,Name
quedan más tiempo del necesario,fuente
throw
existe un nombre idéntico en lugar de devolver un objeto, o si devuelve unnull
objeto.destructor
serí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>
.