Ответ 1
Вы рассматривали простую оболочку вокруг объектов, которые хотите кэшировать?
class Wrapper {
YourObject object;
public boolean equals(Object someOther) {
...
}
public int hashCode() {
}
}
Я хотел бы знать о карте, которая работает как обычный HashMap/Hashtable, за исключением того, что она принимает функцию, которая возвращает хэш-код и выполняет тест равенства, вместо того чтобы позволить HashMap использовать Object.hashCode/equals.
Я не могу использовать TreeMap, потому что объекты не реализуют Comparable, и нет стабильного способа обработки случая с неравными объектами. Нельзя использовать System.identityHashCode, потому что существует вероятность конфликтов для объектов, которые не равны.
В идеале было бы замечательно, если бы Карта применила функцию аналогичным образом, чтобы поставлять собственный Компаратор в TreeMap вместо того, чтобы позволить параметрам листинга TreeMap сопоставляться.
Единственный способ обойти эту проблему - обернуть каждый ключ и сделать обертку обычным хешированием/равным, но, безусловно, лучше.
Вы рассматривали простую оболочку вокруг объектов, которые хотите кэшировать?
class Wrapper {
YourObject object;
public boolean equals(Object someOther) {
...
}
public int hashCode() {
}
}
При использовании TreeMap объекты на карте не требуются для реализации Comparable.
Plume-lib WeakHasherMap делает то, что вы хотите: его конструктор принимает в качестве аргумента Hasher, который определяет метод hashCode()
и метод equals()
.
(Это существовало в то время, когда вы написали свой вопрос, но я только заметил ваш вопрос сейчас, через 6,5 лет после того, как вы его спросили.)
Редактировать: я являюсь хранителем plume-lib.
Я предложил интерфейс для такой "хэш-функции" некоторое время назад.
Теперь вам нужно выполнить любую реализацию хэш-карты (например, OpenJDK - GPL) и изменить все вызовы hashCode()
и .equals()
с вызовами этого хэш-объекта. Я сделал это один раз (много лет назад), но он не опубликован.