Szukam różnych sposobów, aby upewnić się, że każda instancja danej klasy jest instancją jednoznacznie identyfikowalną.
Na przykład mam Name
klasę z polem name
. Gdy mam już Name
obiekt z name
zainicjalizowaną wersją dla Johna Smitha, nie chcę być w stanie utworzyć instancji innego Name
obiektu, również o nazwie John Smith, lub jeśli wystąpi instancja, chcę raczej przekazać odwołanie do obiektu oryginalnego niż nowy obiekt.
Wiem, że jednym ze sposobów jest posiadanie statycznej fabryki, która przechowuje Map
wszystkie bieżące obiekty Name, i fabryka sprawdza, czy obiekt z Johnem Smithem, ponieważ nazwa nie istnieje, przed przekazaniem odwołania do Name
obiekt.
Innym sposobem, w jaki mogłem pomyśleć z góry, jest posiadanie statycznej mapy w Name
klasie i gdy wywoływany jest konstruktor, zgłaszający wyjątek, jeśli przekazywana wartość name
jest już używana w innym obiekcie, jednak zdaję sobie sprawę z wyjątków w konstruktorze jest ogólnie złym pomysłem .
Czy istnieją inne sposoby osiągnięcia tego?
źródło
I'm aware that one way of doing this is to have a static factory that holds a Map...
Dlaczego więc nie chcesz tego zrobić?Odpowiedzi:
Właściwie już odpowiedziałeś na swoje pytanie. Twój pierwszy sposób powinien być tutaj bardziej skuteczny. Używanie
static factory
jest zawsze lepsze niżconstructor
gdziekolwiek myślisz, że możesz. Tak więc możesz uniknąć używaniaConstructor
w tym przypadku, inaczej byłoby,throw some exception
gdyby istniała już instancja o podanej nazwie.Możesz więc utworzyć statyczną metodę fabryczną: -
getInstanceWithName(name)
która otrzyma już dostępną instancję o tej nazwie, a jeśli nie istnieje, utworzy nową instancję i uczyni twojąconstructor
prywatną, tak jak powinno się to zrobić w większości przypadkówstatic factories
.Ponadto w tym celu musisz utrzymać statyczne
List
lubMap
wszystkie utworzone unikalne wystąpienia w swojejFactory
klasie.EDYCJA : -
Z pewnością powinieneś przejść przez - Skuteczna Java - Punkt 1: Rozważ fabryki statyczne nad Konstruktorami . Nie ma lepszego wyjaśnienia niż ta książka.
źródło
Wzmianki o skutecznej Javie wydają się zwiększać wiarygodność, więc ta odpowiedź opiera się na:
Cofnąłbym się i zapytałbym, dlaczego przejmujesz się, jeśli istnieje więcej niż jedna instancja tego obiektu nazwy.
Rzadko potrzebuję tego rodzaju łączenia obiektów. Sądzę, że OP robi to, aby mogli po prostu porównać swoje
Name
obiekty==
. Lub użyjName
obiektów wewnątrzHashMap
lub podobnych jako klucza.Jeśli tak, jest to coś, co można rozwiązać poprzez prawidłowe wdrożenie
equals()
.Tak jak:
Po wykonaniu tej czynności spełnione są następujące warunki:
Zgaduję twój cel, ale w ten sposób możesz wykorzystać
Name
klasę w mapach skrótów itp. I nie muszą to być dokładnie te same wystąpienia.źródło
Name
interfejsNameFactory
za pomocą metodyName getByName(String)
NameFactory
zMap<String,WeakReference<Name>>
wewnątrzsynchronize
na mapie według nazwy wewnątrzgetByName
metody przed utworzeniem nowych instancjiName
Name
interfejsu wewnątrz swojej implementacjiNameFactory
Takie podejście pozwoli ci upewnić się, że:
Name
istnieje tylko jedna instancja ,Name
dłużej, niż trzebaźródło
throw
taka sama nazwa zamiast zwracać obiekt, lub jeśli zwracany jestnull
obiekt.destructor
przydałby się.powinieneś
getNameInstance(String)
ustawić konstruktory na prywatne i stworzyć metody, takie jak : jeśli obiekt o tej samej nazwie już istnieje (na przykład na podstawie klasy statycznej „hastable”), zwrócisz to odwołanie, w przeciwnym razie utworzysz nowy obiekt za pomocą prywatnego konstruktora i dodasz go do hashtableźródło
Spróbuj śledzić. Musisz śledzić każdy tworzony obiekt. W tym celu używam listy. I uczyniono konstruktorem klas prywatnym, aby można było zastosować kontrolę wstępną przed utworzeniem instancji
źródło
List
. To byłoby dobre dlaDictionary<string,UniqueName>
.