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);
}Глупости, конечно, такие мелочи не спасут отца русской демократии, но что-то демонстрирует.
no subject
Date: 2013-06-30 08:00 pm (UTC)no subject
Date: 2013-06-30 10:25 pm (UTC)HashMap.get пользуется k == p. Но у нас WeakHashMap, поэтому нужно сравнить Option(p) и k. Практически очевидно, нужно сравнение лифтить: w.map(p => p == k).getOrElse(false)
В голой джаве функции передавать не выйдет, для этого нужно добавить метод equalsLifted в WeakReference (SoftReference, ...). Если бы как-то так было реализовано, то не нужно было бы для разных видов semi reference реализовывать свои HashMap, List, итд.
Не то, чтобы это сильно улучшало джаву, но это как раз пример, где Option в принципе есть, а заменить его на if ...==null (как бы, крики неосиляторов) не удобно.
no subject
Date: 2013-06-30 11:22 pm (UTC)no subject
Date: 2013-06-30 11:37 pm (UTC)Object.equalsLifted() = equals();
WeakReference.equalsLifted(k) = {
K p = get();
return p != null && p.equals(k);
}
no subject
Date: 2013-07-01 08:22 am (UTC)no subject
Date: 2013-07-01 08:25 am (UTC)