Мы, должно быть, много раз слышали, что перечисления всегда являются лучшим выбором для реализации шаблона проектирования singleton в Java. Действительно ли они лучшие? Если да, то чем они лучше других доступных методов? Давайте выясним.
Написание реализации синглтона всегда сложно. Я уже обсуждал пару методов(включая мой любимый метод) в этом сообщении в блоге. Я ясно написал там, что перечисления обеспечивают неявную поддержку потокобезопасности и гарантируется только один экземпляр. Это также хороший способ получить синглтон с минимальными усилиями.
1. Проблемы с Enum как синглтоном
Тем не менее, как и у всего остального во Вселенной, у этого подхода есть свои недостатки, которые нам необходимо учитывать, прежде чем принимать какое-либо решение.
- По умолчанию перечисления не поддерживают отложенную загрузку.
- Хоть это и бывает очень редко, но если мы передумаем и захотим преобразовать синглтон в мультитон, перечисление не позволит этого сделать.
Если оба вышеприведенных случая не представляют для кого-то проблемы, то, вероятно, лучшим выбором будет enum.
В любом случае, замечу, что после компиляции перечисления Java преобразуются в классы только с дополнительными методами, например, values() и valueOf()… и т. д.
2. Пример синглтона на основе перечисления
Как только мы решили написать синглтон на основе перечисления, написать его будет совсем просто:
public enum PathUtils {INSTANCE;public static PathUtils getInstance() {return INSTANCE;}PathUtils() {rootPath = Paths.get("");}private final Path rootPath;public Path getRootPath() {return rootPath;}}
Теперь мы можем использовать PathUtils следующим образом:
PathUtils pathUtils = PathUtils.getInstance();
Помните, что поскольку это перечисление, мы всегда можем получить к нему доступ через PathUtils.INSTANCE.
PathUtils pathUtils = PathUtils.INSTANCE