Вы обычно не используете их в повседневном программировании (по крайней мере, я так не думаю, и я думаю, что большинство из нас этого не делают), но они могут быть очень полезны!
практические сценарии для менябудет:
WeakReference для целей отладки (например, отслеживание открытых соединений с базой данных).
SoftReference для быстрого и грязного кэша (например, кэширование больших Java-POJO, которые «дорого» создавать ине должен быть немедленно очищен).
PhantomReference действительно невыполним по моему мнению.