Хороший шаблон для создания объекта, который поддерживает интернирование? - PullRequest
2 голосов
/ 12 августа 2011

Мне нужен класс, который поддерживает интернирование, как класс Java String. При создании экземпляра класса он должен возвращать уже существующую ссылку, если ссылка с такими же параметрами уже существует. В противном случае он должен вернуть новую ссылку. Такие что:

Foo a = new Foo(5);
Foo b = new Foo(5);
Foo c = new Foo(6);
a == b
a != c

1) Задача фабрики состоит в том, чтобы поддерживать таблицу уже существующих объектов или таблица обычно является просто статической переменной внутри самого класса?

2) Что такое таблица уже существующих объектов? Это набор объектов, который вы просматриваете каждый раз при запросе экземпляра, или это карта, в которой ключи - это объекты, а значения - параметры?

Ответы [ 3 ]

2 голосов
/ 12 августа 2011
1 голос
/ 12 августа 2011

Если вы можете добавить стороннюю зависимость, рассмотрите Google Guava и его Interners класс. У него два простых интернера: а WeakInterner и а StrongInterner. StrongInterner поддерживается ConcurrentMap и лучше всего подходит для небольшого закрытого набора значений. Если вы не можете контролировать или каким-либо образом ограничивать то, что интернировано, тогда вы можете выбрать WeakInterner, который опирается на WeakReference s. Компромисс для использования WeakInterner - производительность.

0 голосов
/ 12 августа 2011

Вы не можете сделать это с оператором new, который не будет повторно использовать существующий объект. Фабрика - лучший способ сделать это. (Это может быть так же просто, как статический newInstance метод класса.) Обычная структура данных для этого - это своего рода Карта (обычно HashMap). Набор будет намного дороже. В зависимости от количества объектов, вы можете просто использовать массив. (Я думаю, что это может быть то, что делает Байт.)

Обратите внимание, что объекты String не интернируются автоматически, и при вызове intern он может вернуть другой экземпляр String. например, этот код выведет «false»:

String a = new String("hello");
String b = new String("hello");
a.intern();
b.intern();
System.out.println(a == b ? "true" : "false");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...