Tuve la misma pregunta en el foro de Java hace años. Me dijeron que la interfaz Set está definida. No se puede cambiar porque romperá las implementaciones actuales de la interfaz Set. Luego, comenzaron a reclamar mierda, como veis aquí: "Set no necesita el método get" y comenzó a taladrarme que siempre se debe usar Map para obtener elementos de un conjunto.
Si usa el conjunto solo para operaciones matemáticas, como intersección o unión, entonces puede contener() es suficiente. Sin embargo, Set se define en colecciones para almacenar datos.Expliqué por necesidad get() en Set usando el modelo de datos relacionales.
En lo que sigue, una tabla SQL es como una clase. Las columnas definen atributos (conocidos como campos en Java) y los registros representan instancias de la clase. De modo que un objeto es un vector de campos. Algunos de los campos son claves primarias. Ellos definen la singularidad del objeto. Esto es lo que haces para contains() en Java:
class Element {
public int hashCode() {return sumOfKeyFields()}
public boolean equals(Object e) {keyField1.equals(e) && keyField2.equals(e) && ..}
No estoy al tanto de los componentes internos DB. Pero, especifica campos clave solo una vez, cuando define una tabla. Simplemente anota los campos clave con @primary. No especifica las claves por segunda vez, cuando agrega un registro a la tabla. No separa las claves de los datos, como lo hace en el mapeo. Las tablas SQL son conjuntos. No son mapas. Sin embargo, proporcionan get() además de mantener la exclusividad y contiene() verificación.
En "Art of Computer Programming", la introducción de la búsqueda, D. Knuth dice lo mismo:
La mayor parte de este capítulo se dedica al estudio de una manera muy simple problema de búsqueda : cómo encontrar el datos que se almacenaron con una identificación dada .
Verá, los datos se almacenan con identificación. No hay identificación que apunte a datos, pero datos con identificación. Continúa:
Por ejemplo, en una aplicación numérica puede ser que deseemos para encontrar f (x), x dado y una tabla con los valores de f; en una aplicación no numérica , es posible que deseemos encontrar la traducción al inglés de una palabra rusa determinada.
Parece que comienza a hablar sobre el mapeo. Sin embargo,
En general, vamos a suponer que un conjunto de N registros se ha almacenado, y el problema es localizar el apropiado. Generalmente requerimos las N teclas para ser distintas, de modo que cada clave identifica de forma única su registro . La colección de todos los registros se llama tabla o archivo, donde la palabra "tabla" se usa generalmente para indicar un archivo pequeño, y "archivo" se usa generalmente para indicar una tabla grande. Un archivo grande o un grupo de archivos se denomina con frecuencia una base de datos .
Los algoritmos para buscar se presentan con el llamado argumento, K, y el problema es encontrar qué registro tiene K como su clave. Aunque el objetivo de de búsqueda es encontrar la información almacenada en el registro asociado con K, los algoritmos en este capítulo generalmente ignoran todo menos las claves mismas. En la práctica, podemos encontrar los datos asociados una vez que hemos localizado K; por ejemplo, si K aparece en ubicación TABLA + i, los datos asociados (o un puntero a ella) podría ser en lugar TABLA + i + 1
Es decir, la búsqueda localiza la clave presentada de la grabar y no debe "mapear" la clave de los datos.Ambos se encuentran en el mismo registro, como los archivos de objeto java. Es decir, el algoritmo de búsqueda examina los campos clave del registro, como lo hace en el conjunto, en lugar de una clave remota, como lo hace en el mapa.
Nos dan N artículos para ser ordenados; los llamaremos registros y toda la colección de N registros se llamará archivo. Cada registro tiene una clave Kj, que rige el proceso de clasificación. Datos adicionales , además de la clave, también suelen estar presentes; este "satélite adicional información" no tiene ningún efecto en la clasificación, excepto que debe llevarse junto con cada registro.
Ni, no veo la necesidad de duplicar las claves en un "juego de llaves" adicional en su discusión sobre la clasificación.
... [ "The Art of Computer Programming", Capítulo 6, Introducción]
conjunto de entidades es una colección o conjunto de todas las entidades de una entidad en particular de tipo [http: // wiki. answers.com/Q/What_is_entity_and_entity_set_in_dbms] Los objetos de una clase comparten sus atributos de clase. Del mismo modo, haz registros en DB. Comparten atributos de columna.
Un caso especial de una colección es una extensión de clase, que es la colección de todos los objetos que pertenecen a la clase. extensiones de clase permiten clases para ser tratados como las relaciones
... [ "Fundamentos de bases de datos", sexta edición]
Básicamente, clase describe los atributos comunes a todas sus instancias. Una tabla en DB relacional hace lo mismo. "The easiest mapping you will ever have is a property mapping of a single attribute to a single column." Este es el caso del que estoy hablando.
estoy muy prolijo en demostrar la analogía (isomorfismo) entre los objetos y los registros de base de datos porque hay gente estúpida que no aceptan que (para demostrar que su conjunto no debe tener la obtener método)
¿Ves en repeticiones cómo las personas, que no entienden esto, dicen que Set with get sería redundante? Es porque su mapa abusado, que imponen usar en lugar del conjunto, introduce la redundancia. Su llamada a put (obj.getKey(), obj) almacena dos claves: la original como parte del objeto y una copia de la misma en el conjunto de teclas del mapa. La duplicación es la redundancia. También implica más hinchazón en el código y desperdicia memoria consumida en Runtime. No sé acerca de las partes internas de DB, pero los principios de buen diseño y normalización de la base de datos dicen que esa duplicación es mala idea: there must be only one source of truth. La redundancia significa que puede haber inconsistencia: la clave se asigna a un objeto que tiene una clave diferente. La inconsistencia es una manifestación de redundancia. Edgar F. Codd proposed DB normalization solo para deshacerse de las redundancias y sus incoherencias inferidas.Los maestros son explícitos en la normalización: Normalization will never generate two tables with a one-to-one relationship between them. There is no theoretical reason to separate a single entity like this with some fields in a single record of one table and others in a single record of another table
Por lo tanto, tenemos 4 argumentos, por qué usar un mapa para la implementación de ponerse en juego es malo:
- el mapa no es necesaria cuando tenemos un conjunto de objetos únicos
- mapa introduce redundancia en el almacenamiento de tiempo de ejecución
- mapa presenta hinchazón de código en la base de datos (en las colecciones)
- en el mapa contradice la normalización de almacenamiento de datos
Incluso si no conoce la idea de conjunto de registros y la normalización de datos, jugando con colecciones, puede descubrir esta estructura de datos y algoritmo usted mismo, como lo hicimos nosotros, org.eclipse.KeyedHashSet y C++ STL designers.
Fui excluido del foro de Sun por señalar estas ideas. El fanatismo es el único argumento en contra de la razón y este mundo está dominado por fanáticos. No quieren ver conceptos y cómo las cosas pueden ser diferentes/mejoradas. Ven solo el mundo real y no pueden imaginar que el diseño de las Colecciones Java pueda tener deficiencias y pueda mejorarse. Es peligroso recordar cosas lógicas a tales personas. Te enseñan su ceguera y castigan si no obedeces.
añadido Dec 2013: SICP also says that DB is a set with keyed records rather than a map:
Un típico sistema de gestión de datos gasta una gran cantidad de tiempo acceder o modificar los datos en los registros y por lo tanto requiere un método eficiente para acceder a los registros. Esto se hace identificando como parte de cada registro para que sirva como clave de identificación. Ahora representamos la base de datos como un conjunto de registros.
Realmente quiero hacer esto, pero con la llave de un Mapa. Me gusta, quiero que Map.getKey (K k) devuelva k 'donde k.equals (k'). ¿Puedo hacer esto con tu hack? ¿O tendré que hacer un par, y cambiar mi Mapa a Map >? –
Jayen
"A diferencia de la mayoría de los demás tipos de colecciones, en lugar de recuperar un elemento específico de un conjunto, normalmente se prueba un valor para la pertenencia a un conjunto". http://en.wikipedia.org/wiki/Set_(abstract_data_type) – GClaramunt