Предположим, что у вас есть многопоточное приложение, для которого требуется центральное хранилище данных. Потребители и производители используют или помещают данные в хранилище, включая внешний объект приложения, который обращается к хранилищу через интерфейс.
Если вы сделаете этот репозиторий обычным объектом класса, у вас будет проблема с его инициализацией и получением указателя на каждый объект, который в нем нуждается. Не самая сложная проблема, но она может очень запутать множество потоков и объектов.
С другой стороны, если вы сделаете это:
public enum Data implements MyInterface{
INSTANCE;
private final Whatevertype secretstuff = new Whatevertype();
...etc...
public void PutThing( Sometype indata){ ... };
public Sometype GetThing( int somecode ){ ...};
...etc...
}
Вы (а) не должны ничего создавать и (b) можете получить доступ из любого места с помощью
Data.INSTANCE.GetThing(42);
и т.д.. Это как Горец ... ТОЛЬКО МОЖЕТ БЫТЬ ОДИН