2009-03-17 10 views
6

Tenga en cuenta que en realidad no estoy haciendo nada con una base de datos aquí, por lo que las herramientas ORM probablemente no sean lo que estoy buscando.¿Hay una colección Java (o similar) que se comporte como una tabla SQL de identificación automática?

Quiero tener algunos contenedores que contengan cada uno un número de objetos, con todos los objetos en un contenedor de la misma clase. El contenedor debe mostrar parte del comportamiento de una tabla de base de datos, a saber:

  • permiten que uno de los campos del objeto se use como clave única, i. mi. otros objetos que tienen el mismo valor en ese campo no se agregan al contenedor.
  • al aceptar un nuevo objeto, el contenedor debe emitir una identificación numérica que se devuelve a la persona que llama del método de inserción.

En lugar de arrojar un error cuando se solicita una "entrada duplicada", el contenedor debe omitir la inserción y devolver la clave del objeto ya existente.

Ahora, escribiría una clase de contenedor genérica que acepta objetos que implementan una interfaz para obtener el valor del campo de clave y utiliza un HashMap con esos valores como la clase de almacenamiento real. ¿Hay un mejor enfoque utilizando clases incorporadas existentes? Estaba mirando a través de HashSet y similares, pero no parecían encajar.

Respuesta

4

Ninguna de las clases de colecciones hará lo que necesite. ¡Tendrás que escribir el tuyo!

P.S. También necesitarás decidir si tu clase será segura o no.

P.P.S. ConcurrentHashMap está cerca, pero no es exactamente lo mismo. Si puede crear una subclase, envolver o envolver los objetos que ingresan en su mapa de modo que solo confíe en esa clase para seguridad de subprocesos, tendrá una implementación eficiente y segura para subprocesos.

1

Estaba pensando que podría hacerlo con ArrayList, usando la ubicación actual en la matriz como "id", pero eso no le impide hacer una inserción en una ubicación existente, más cuando inserta en esa ubicación , moverá todo hacia arriba. Pero puede basar su propia clase en ArrayList, devolviendo el valor actual de .size() después de un .add.

3

Puede simular este comportamiento con un HashSet. Si los objetos que está agregando a la colección tienen un campo que puede usar como ID único, simplemente haga que ese campo sea devuelto por el método hashCode() del objeto (o use un valor calculated hash code, cualquiera de las dos maneras debería funcionar).

HashSet no arrojará un error cuando add una entrada duplicada, simplemente devuelve falso. Podría ajustar (o ampliar) HashSet para que su método de agregar la ID única que desea como valor de retorno.

1

¿Hay alguna razón por la que el código hash del objeto no se pueda usar como un "id. Numérico"?

Si no, todo lo que necesita hacer es envolver la llamada en un ConcurrentHashMap, devolver el código hash del objeto y usar el método putIfAbsent (clave K, valor V) para asegurarse de no agregar duplicados.

putIfAbsent también devuelve el valor existente, por lo que podría obtener su hashCode para devolver a su usuario.

Ver ConcurrentHashMap

+1

@Benjamin: códigos hash no se pueden utilizar como ID numéricos porque no son únicos. – CPerkins

Cuestiones relacionadas