No estoy seguro de cuáles son las opiniones predominantes sobre el uso de objetos dinámicos como Conjuntos como teclas en Mapas.En Java, ¿qué precauciones se deben tomar al usar un conjunto como clave en un mapa?
Sé que las implementaciones típicas de mapas (por ejemplo, HashMap) usan un hashcode para decidir en qué segmento colocar la entrada y que si hashcode debe cambiar de alguna manera (tal vez porque el contenido del conjunto debe cambiar, entonces eso podría estropear el HashMap haciendo que el cubo se compute incorrectamente (en comparación con la forma en que el Set se insertó inicialmente en el HashMap).
Sin embargo, si me aseguro de que el contenido del Conjunto no cambie en absoluto, ¿esta opción es viable? Aun así, ¿este enfoque generalmente se considera propenso a errores debido a la naturaleza inherentemente volátil de los conjuntos (incluso si se toman precauciones para garantizar que no se modifiquen)?
Parece que Java permite designar argumentos de función como finales; esta es quizás una precaución menor que podría tomarse?
¿La gente hace incluso cosas como esta en la práctica comercial/de código abierto? (Ponga Lista, Conjunto, Mapa, o similar como claves en Mapas?)
Creo que debería describir algo de lo que estoy tratando de lograr con esto, para que la motivación se vuelva más clara y tal vez las implementaciones alternativas podría ser sugerido
Lo que estoy tratando de lograr es tener algo de este tipo:
class TaggedMap<T, V> {
Map<Set<T>, V> _map;
Map<T, Set<Set<T>>> _keys;
}
... en esencia, para ser capaz de "etiquetar" ciertos datos (V) con ciertas teclas (T) y escribir otras funciones auxiliares para acceder/modificar los datos y hacer otras cosas sofisticadas con él (es decir, devolver una lista de todas las entradas que cumplan algunos criterios de claves). La función de _keys es servir como una especie de índice, para facilitar la búsqueda de los valores sin tener que pasar por todas las entradas de _map.
En mi caso, tengo la intención de utilizar específicamente T = String, V = Integer. Alguien que hablé de esto había sugerido la sustitución de una cadena para el conjunto, es decir, algo así como:
class TaggedMap<V> {
Map<String, V> _map;
Map<T, Set<String>> _keys;
}
donde la clave en _MAP es del tipo "key1; clave2; key3" con teclas separadas por delimitador. Pero me preguntaba si podría lograr una versión más general de esto en lugar de tener que aplicar una cadena con delimitadores entre las claves.
Otra cosa que me preguntaba era si había alguna manera de hacer esto como una extensión de mapa. Estaba imaginando algo como:
class TaggedMap<Set<T>, V> implements Map<Set<T>, V> {
Map<Set<T>, V> _map;
Map<T, Set<Set<T>>> _keys;
}
Sin embargo, yo no era capaz de conseguir esto para compilar, probablemente debido a mi entender inferiores de los genéricos. Con esto como un objetivo, ¿alguien puede corregir la declaración anterior para que funcione de acuerdo con el espíritu de lo que he descrito o sugerir algunas ligeras modificaciones estructurales? En particular, me pregunto acerca de la cláusula "implementa Map, V>", si es posible declarar una implementación de interfaz tan compleja.
Su último fragmento estará bien si cambia el tipo a: 'clase TaggedMap implementa Map , V>'. –
perp