2009-03-17 1 views
6

Обратите внимание, что я на самом деле ничего не делаю с базой данных, поэтому инструменты ORM, вероятно, не то, что я ищу.Есть ли коллекция Java (или аналогичная), которая ведет себя как таблица SQL с автоматическим идентификатором?

Я хочу иметь несколько контейнеров, каждый из которых содержит несколько объектов, причем все объекты в одном контейнере имеют один класс. В контейнере должно отображаться поведение таблицы базы данных, а именно:

  • позволяет одному из полей объекта использоваться как уникальный ключ, т.е. е. другие объекты, которые имеют одинаковое значение в этом поле, не добавляются в контейнер.
  • после принятия нового объекта, контейнер должен выдавать числовой идентификатор, возвращаемый вызывающему устройству метода вставки.

Вместо того, чтобы вызывать ошибку при запросе «повторяющейся записи», контейнер должен просто пропустить вставку и вернуть ключ уже существующего объекта.

Теперь я бы написал универсальный контейнерный класс, который принимает объекты, которые реализуют интерфейс, чтобы получить значение поля ключа и использовать HashMap с этими значениями в качестве реального класса хранения. Есть ли лучший подход с использованием существующих встроенных классов? Я просматривал HashSet и тому подобное, но они, похоже, не подходили.

ответ

4

Ни один из классов Коллекции не будет делать то, что вам нужно. Вам придется писать свои собственные!

P.S. Вам также нужно будет решить, будет ли ваш класс потокобезопасным или нет.

P.P.S. ConcurrentHashMap близко, но не совсем то же самое. Если вы можете подклассировать или обернуть его или обернуть объекты, которые вводят вашу карту, чтобы вы полагались только на этот класс для обеспечения безопасности потоков, вы получите эффективную и потокобезопасную реализацию.

1

Я думал, что вы можете сделать это с помощью ArrayList, используя текущее местоположение в массиве как «id», но это не мешает вам вставлять в существующее место, , он все переместит. Но вы можете создать свой собственный класс в ArrayList, возвращая текущее значение .size() после .add.

3

Вы можете имитировать эту ситуацию с помощью HashSet. Если объекты, которые вы добавляете в коллекцию, имеют поле, которое вы можете использовать как уникальный идентификатор, просто получите это поле, возвращаемое методом hashCode() объекта (или используйте значение calculated hash code, любой из них должен работать).

HashSet не будет вызывать ошибку, если вы add дубликат записи, он просто возвращает false. Вы можете обернуть (или расширить) HashSet, чтобы ваш метод добавления возвращал уникальный идентификатор, который вы хотите как возвращаемое значение.

1

Есть ли причина, по которой хэш-код объекта не может использоваться как «числовой идентификатор»?

Если нет, то все, что вам нужно сделать, это обернуть вызов в ConcurrentHashMap, вернуть хэш-код объекта и использовать метод putIfAbsent (K key, V value), чтобы убедиться, что вы не добавляете дубликаты.

putIfAbsent также возвращает существующее значение, поэтому вы можете вернуть его hashCode для своего пользователя.

См ConcurrentHashMap

+1

@Benjamin: хэш-коды не могут быть использованы в качестве цифровых идентификаторов, так как они не уникальны. – CPerkins

Смежные вопросы