[personal profile] sassa_nf
А как насчёт добавить классам public boolean equalsLifted(A obj).

Мотивирующий пример:

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);
}


Глупости, конечно, такие мелочи не спасут отца русской демократии, но что-то демонстрирует.

Date: 2013-06-30 08:00 pm (UTC)
From: [identity profile] juan-gandhi.livejournal.com
Типа Option(k) == Option(p). Довольно часто так пишу.

Date: 2013-06-30 10:25 pm (UTC)
From: [identity profile] sassa-nf.livejournal.com
хотелось сказать немного иное.

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 (как бы, крики неосиляторов) не удобно.

Date: 2013-06-30 11:22 pm (UTC)
From: [identity profile] juan-gandhi.livejournal.com
Ну да... но есть же лучше решение. dump java.

Date: 2013-06-30 11:37 pm (UTC)
From: [identity profile] stdray.livejournal.com
А можно для заблудших прокомментировать ?


Object.equalsLifted() = equals();
WeakReference.equalsLifted(k) = {
K p = get();
return p != null && p.equals(k);
}

Date: 2013-07-01 08:22 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
это псевдонаучная небрежная запись "а у Object определим метод equalsLifted равный equals" и "а у WeakReference equalsLifted запишем, как проверка ссылки на нуль, а потом сравнение этой ссылки с переданным значением"

Date: 2013-07-01 08:25 am (UTC)
From: [identity profile] stdray.livejournal.com
Спасибо. Не было бы скобок, можно было бы и догадаться. А так скобки, вызов и работа с результатом - никак не догадаешься.
Page generated May. 24th, 2026 06:56 am
Powered by Dreamwidth Studios