hirthwork

Неожиданный подход к INSTANCE классам раскопал в исходниках jdk.
Рассмотрим на примере. Допустим у нас есть Runnable, который только и делает, что выводит на экран приветствие.
Как бы я это писал до сегодняшнего дня (и как я это начал писать полчаса назад):

final class Greeting implements Runnable {
    public static final Greeting INSTANCE = new Greeting();

    private Greeting() {
    }

    @Override
    public void run() {
        System.out.println("Hello, world");
    }
}

Здесь:
- Мы помним, что работаем с живыми людьми, поэтому явно запрещаем создавать новые объекты этого типа. Ибо нехуй. Поэтому явно прописываем private конструктор.
- В 11 строках четыре раза повторяется имя класса, 226 символов.

Тут мы вспоминаем, что перечисления умеет имплементировать интерфейсы:

enum EnumGreeting implements Runnable {
    INSTANCE;

    @Override
    public void run() {
        System.out.println("Hello again");
    }
}

Всё есть «из коробки»:
- Новый объект не создашь.
- Имя класса используется всего один раз, итого 8 строк и 144 символа. Теперь это мой новый Golden Hammer.

P.S. Домашнее задание самым любопытным читателям: поебаться с дженериками реализовать natural order comparator, который бы предоставлял static функцию get() возвращающую компаратор для любого Comparable типа, и при этом не аллоцировала новый объект.

P.P.S. Домашнее задание самым любопытным и дотошным: лососнуть тунца понять, почему предыдущее задание нельзя выполнить при помощи подхода основанного на классе со static final полем.