Я ищу различные способы гарантировать, что каждый экземпляр данного класса является уникально идентифицируемым экземпляром.
Например, у меня есть Name
класс с полем name
. После того, как у меня есть Name
объект с name
инициализацией для Джона Смита, я не хочу иметь возможность создавать экземпляр другого Name
объекта также с именем, как у Джона Смита, или, если экземпляр имеет место, я хочу, чтобы ссылка на оригинальный объект передавалась обратно. чем новый объект.
Я знаю, что один из способов сделать это - иметь статическую фабрику, которая содержит Map
все текущие объекты Name, и фабрика проверяет, что объект с Джоном Смитом в качестве имени еще не существует, перед передачей ссылки на Name
объект.
Другим способом, который я мог бы придумать, является наличие статической карты в Name
классе, и когда конструктор вызывается, вызывая исключение, если переданное значение name
уже используется в другом объекте, однако я знаю, выбрасывать исключения в конструкторе вообще плохая идея .
Есть ли другие способы достижения этого?
источник
I'm aware that one way of doing this is to have a static factory that holds a Map...
Так почему бы вам не сделать это таким образом?Ответы:
На самом деле вы уже ответили на свой вопрос. Ваш первый путь должен быть более эффективным здесь. Использование
static factory
всегда предпочтительнее, чемconstructor
везде, где вы думаете. Таким образом, вы можете избежать использованияConstructor
в этом случае, иначе вы бы имели,throw some exception
если экземпляр уже существует с данным именем.Таким образом, вы можете создать статический метод фабрики: -
getInstanceWithName(name)
который получит уже доступный экземпляр с этим именем, и если он не существует, он создаст новый экземпляр и сделает вашconstructor
приватный, как это обычно следует делать при работе сstatic factories
,Кроме того, для этого вам нужно поддерживать статичность
List
илиMap
все созданные уникальные экземпляры в вашемFactory
классе.РЕДАКТИРОВАТЬ : -
Вы должны обязательно пройти - Эффективная Java - Пункт # 1: Рассмотрите Статические фабрики по Конструкторам . Вы не можете получить лучшее объяснение, чем эта книга.
источник
Упоминания об эффективной Java кажется, добавляют много правдоподобности, поэтому этот ответ опирается на:
Я хотел бы сделать шаг назад и спросить, почему вас волнует, существует ли более одного экземпляра этого объекта имени.
Мне редко нужно делать такой вид пула объектов. Я думаю, что ОП делает это, чтобы они могли просто сравнивать свои
Name
объекты==
. Или используйтеName
объекты внутриHashMap
или аналогичные в качестве ключа.Если это так, то это можно решить путем правильной реализации
equals()
.Вот так:
После этого верно следующее:
Я предполагаю вашу цель, но таким образом вы можете использовать
Name
класс в хеш-картах и т. Д., И они не обязательно должны быть точно такими же.источник
Name
интерфейсNameFactory
с методомName getByName(String)
NameFactory
сMap<String,WeakReference<Name>>
внутренней частьюsynchronize
на карте по имени внутриgetByName
метода, прежде чем делать новые экземплярыName
Name
интерфейса внутри вашей реализацииNameFactory
Этот подход позволит вам убедиться, что:
Name
существует в любое время,Name
s остаются вокруг дольше, чем нужно,источник
throw
используете идентичное имя вместо возврата объекта или если вы возвращаетеnull
объект.destructor
будет удобно.вы должны сделать конструкторы частными и создать методы, например
getNameInstance(String)
, если объект с таким именем уже существует (например, на основе hastable статического класса), вы возвращаете эту ссылку, в противном случае вы создаете новый объект с помощью вашего частного конструктора и добавляете его в хеш-таблицуисточник
Попробуйте следующее. Вы должны отслеживать каждый объект, который вы создаете. Для этого я использую список. И сделал конструктор класса закрытым, так что предварительная проверка может быть применена перед созданием экземпляра
источник
List
. Это было бы хорошо дляDictionary<string,UniqueName>
.