Просто быстрое предупреждение:
Это не было явно упомянуто выше, но должно быть очевидно, что интернируемые объекты должны быть неизменяемого типа.
На втором примечании: вам не нужно использовать другую слабую ссылку на объект в качестве значения на карте, ссылка на статический будет достаточной, если вы просто полагаетесь на набор ключей карты для данных,Например, объявите:
WeakHashMap<T,Boolean>
И вставьте пары в виде:
pool.put (object, Boolean.TRUE);
Это незначительное сохранение экземпляра WeakReference (если вы не можете повторно использовать тот, который используется для ключа).
... или создайте класс WeakSet, как @PeterVerhas сделал со своим WeakPool.