Estou procurando maneiras diferentes de garantir que cada instância de uma determinada classe seja uma instância identificável exclusivamente.
Por exemplo, eu tenho uma Name
classe com o campo name
. Depois de ter um Name
objeto name
inicializado para John Smith, não quero instanciar um objeto diferente.Name
objeto também com o nome John Smith, ou, se ocorrer instanciação, desejo que uma referência ao objeto original seja passada de volta. do que um novo objeto.
Estou ciente de que uma maneira de fazer isso é ter uma fábrica estática que contenha Map
todos os objetos Name atuais e a fábrica verifique se um objeto com John Smith como o nome ainda não existe antes de retornar uma referência a umName
objeto.
Outra maneira que eu poderia pensar é ter um mapa estático na Name
classe e quando o construtor é chamado lançando uma exceção se o valor passado name
já estiver em uso em outro objeto, no entanto, estou ciente lançar exceções em um construtor é geralmente uma má ideia .
Existem outras maneiras de conseguir isso?
fonte
I'm aware that one way of doing this is to have a static factory that holds a Map...
Então, por que você não quer fazer dessa maneira?Respostas:
Na verdade você já respondeu sua pergunta. Seu primeiro caminho deve ser mais eficaz aqui. Usar
static factory
é sempre preferível do queconstructor
onde você acha que pode. Portanto, você pode evitar o usoConstructor
neste caso, caso contrário, você teriathrow some exception
se uma instância já existir com o nome fornecido.Portanto, você pode criar um método estático de fábrica: -
getInstanceWithName(name)
que obterá a instância já disponível com esse nome e, se não existir, criará uma nova instância e tornará suaconstructor
privada, como geralmente deve ser feito ao lidar comstatic factories
.Além disso, para isso, é necessário manter uma estática
List
ouMap
todas as instâncias exclusivas criadas, em suaFactory
classe.EDIT : -
Você certamente deve passar por - Java Efetivo - Item # 1: Considere fábricas estáticas em vez de construtores . Você não pode obter uma explicação melhor do que esse livro.
fonte
As menções ao Java efetivo parecem agregar muita credibilidade, portanto, esta resposta se baseia:
Eu daria um passo para trás e perguntaria por que você se importa se houver mais de uma instância desse objeto de nome.
Eu raramente preciso fazer esse tipo de pool de objetos. Acho que o OP está fazendo isso para que eles possam simplesmente comparar seus
Name
objetos==
. Ou use osName
objetos dentro de umHashMap
ou similar como a chave.Se assim for, isso é algo que pode ser resolvido através da implementação adequada de
equals()
.Igual a:
Feito isso, o seguinte é verdadeiro:
Estou adivinhando o seu objetivo, mas dessa forma você pode usar a
Name
classe em mapas de hash, etc., e eles não precisam ser exatamente a mesma instância.fonte
Name
uma interfaceNameFactory
com um métodoName getByName(String)
NameFactory
com umMap<String,WeakReference<Name>>
dentro delesynchronize
no mapa pelo nome dentro dogetByName
método antes de criar novas instâncias deName
Name
interface dentro de sua implementação doNameFactory
Essa abordagem permitiria garantir que:
Name
existe a qualquer momento,Name
fica mais tempo do que o necessário,fonte
throw
existir um nome idêntico em vez de retornar um objeto ou se você retornar umnull
objeto.destructor
seria útil.você deve tornar os construtores privados e criar métodos como
getNameInstance(String)
, se já existir um objeto com o mesmo nome (com base em uma classe estática 'hastable por exemplo), você retornar essa referência, caso contrário, criar um novo objeto usando seu construtor privado e adicioná-lo para a hashtablefonte
Tente seguir. Você precisa acompanhar cada objeto que criar. Para esse fim, estou usando a Lista. E tornou o construtor de classe privado, para que a pré-verificação possa ser aplicada antes de criar uma instância
fonte
List
. Isso seria um bom ajuste paraDictionary<string,UniqueName>
.