Я не думаю, что есть способ, который эффективен (если вообще) делать это, но я решил, что попрошу, если кто-то другой знает иначе. Я ищу, чтобы создать свою собственную таблицу кэша/поиска. Чтобы сделать его максимально полезным, я хотел бы, чтобы он мог хранить общие объекты. Проблема с этим подходом заключается в том, что даже если вы можете сделать Collections.unmodifiableMap, immutableMap, etc
, эти реализации только мешают вам изменить Карту. Они не мешают вам получать ценность с карты и изменять ее базовые значения. По сути, мне нужно, чтобы что-то случилось с HashMap<K, ? extends Immutable>
, но, насколько мне известно, ничего подобного не существует.Создайте hashmap неизменных общих объектов.
Я был первоначально думал, что я мог бы просто вернуть копию значений в кэше в методе GET, но так как интерфейс в Java Cloneable
это козлы, вы можете не простой вызов
public V getItem(K key){
return (V) map.get(k).clone();
}
Возможно, вы можете достичь этого с помощью некоторой библиотеки отражений, которая может выполнять глубокую копию объектов - это может быть полезно: http://stackoverflow.com/questions/2156120/java-recommended-solution-for-deep-cloning- copy-a-instance –
Следует также добавить, что это должно быть эффективным. Я использую кеш для ускорения операций, и я бы не хотел потерять всю свою экономию от сжатия, чтобы сделать кучу отраженных хаков. – FuriousGeorge
Я думаю, что лучший способ - пойти с неизменными объектами, как кто-то уже упоминал в одном из ответов. Я не знаю ни о каком хорошем методе в java, который может эффективно создавать глубокую копию объекта. Возможно, есть способ вернуть неизменный объект с AspectJ, но я не очень разбираюсь в этом, но, возможно, вы также можете найти решение. –