Первое, что я заметил в коде, это то, что он смешивает универсальные с необработанными типами. Это просто приведет к беспорядку. Javac в JDK7 имеет -Xlint:rawtypes
, чтобы быстро обнаружить ошибку такого рода, прежде чем начнутся проблемы.
Код не является потокобезопасным, но использует статику, поэтому публикуется во всех потоках. Вы, вероятно, не хотите, чтобы он был synchronized
, потому что причина проблем, если он присутствует на многопоточных машинах.
Проблема с использованием SoftReference
для всего кэша заключается в том, что вы будете вызывать пики при очистке ссылки. В некоторых случаях может быть лучше иметь ThreadLocal<SoftReference<Map<K,V>>>
, который бы распространял шипы и безопасность вспомогательных потоков за счет отсутствия разделения между потоками.
Однако создать более умный кеш сложнее. Часто вы получаете значения, ссылающиеся на ключи. Есть способы обойти это немного, это беспорядок. Я не думаю, что эфемероны (по сути, пара связанных Reference
s) собираются создать JDK7. Вы можете найти Коллекции Google, на которые стоит обратить внимание (хотя я этого не сделал).
java.util.LinkedHashMap
дает простой способ ограничить количество кэшированных записей, но не очень полезен, если вы не можете быть уверены, насколько велики записи, и может вызвать проблемы, если он останавливает сбор больших объектных систем, таких как ClassLoader
s. Некоторые люди говорят, что вы не должны оставлять вытеснение из кэша до прихотей сборщика мусора, но тогда некоторые люди говорят, что вы не должны использовать GC.