[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
Спасибо. Не было бы скобок, можно было бы и догадаться. А так скобки, вызов и работа с результатом - никак не догадаешься.

Profile

sassa_nf

February 2026

S M T W T F S
1234567
891011121314
15161718192021
222324252627 28

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 24th, 2026 01:21 am
Powered by Dreamwidth Studios