lift в народном хозяйстве
Jun. 30th, 2013 07:37 pmА как насчёт добавить классам public boolean equalsLifted(A obj).
Мотивирующий пример:
WeakHashMap умеет хранить пары ключ-значение со слабой ссылкой на ключ. Так, если на ключ никто не ссылается сильно, пара ключ-значение из мапы выбрасывается. Решается с помощью заворачивания ключа в WeakReference, и приходится реализовать специальный способ поиска, поскольку в WeakHashMap.get передаём ключ, а не WeakReference, и в процессе поиска сравниваем с ключом ссылку из WeakReference, а не сам WeakReference. Но зато если вам нужен WeakList или SoftHashMap, нужно всё реализовывать заново.
Вместо реализации заново, нужно реализовать equalsLifted, тогда если класс является функтором, то поиск ключа в мапе (или значения в списке) - это тот же equals, но lifted функтором.
Было:
Стало бы:
Глупости, конечно, такие мелочи не спасут отца русской демократии, но что-то демонстрирует.
Мотивирующий пример:
WeakHashMap умеет хранить пары ключ-значение со слабой ссылкой на ключ. Так, если на ключ никто не ссылается сильно, пара ключ-значение из мапы выбрасывается. Решается с помощью заворачивания ключа в WeakReference, и приходится реализовать специальный способ поиска, поскольку в WeakHashMap.get передаём ключ, а не WeakReference, и в процессе поиска сравниваем с ключом ссылку из WeakReference, а не сам WeakReference. Но зато если вам нужен WeakList или SoftHashMap, нужно всё реализовывать заново.
Вместо реализации заново, нужно реализовать equalsLifted, тогда если класс является функтором, то поиск ключа в мапе (или значения в списке) - это тот же equals, но lifted функтором.
Было:
public V get(K k) {
int h = k.hashCode();
for(Entry e: table[h % table.length]) {
WeakReference w = e.getKey();
K p = w.get();
if (p != null && p.equals(k)) return (V)e.getValue();
}
return null;
}Стало бы:
public V get(K k) {
int h = k.hashCode();
for(Entry e: table[h % table.length]) {
Object p = e.getKey();
if (p.equalsLifted(k)) return (V)e.getValue();
}
return null;
}
Object.equalsLifted() = equals();
WeakReference.equalsLifted(k) = {
K p = get();
return p != null && p.equals(k);
}Глупости, конечно, такие мелочи не спасут отца русской демократии, но что-то демонстрирует.