Идиома программирования Java: частный класс реализации

Я нашел эту конструкцию в некотором коде.

Есть ли какая-либо польза для использования частного статического класса A? Это напомнило мне идиому Pimpl в С++. Есть ли какая-либо польза от использования идиомы Pimpl в Java?

public abstract class A {
    public void doStuff();

    public static A getNewInstance() {
       return new AImpl();
    }

    private static class AImpl extends A {
        public void doStuff()  {
           ....
        }    
    } 

}

Ответ 1

Есть ли какая-либо польза для использования частного статического класса A?

Хорошо, он полностью скрывает реализацию, поэтому с точки инкапсуляции это довольно хорошо. Одна ситуация, которую я видел это несколько раз, - это пользовательские компараторы. Например:

public class Person
{
    public static final Comparator<Person> NAME_COMPARATOR = new NameComparator();
    public static final Comparator<Person> AGE_COMPARATOR = new AgeComparator();

    // Name, age etc properties

    private static class NameComparator implements Comparator<Person>
    {
        ...
    }

    private static class AgeComparator implements Comparator<Person>
    {
        ...
    }
}

Нет реальной необходимости, чтобы классы реализации компаратора были видны вне Person, и приятно иметь возможность легко получить экземпляр через публичное статическое поле.

Никакие абоненты не должны знать реализацию - может быть только один класс компаратора, который принимает параметры, например, - они просто выражают, какой компаратор они хотят через константы. (Конечно, вы можете использовать перечисление для этого, конечно.)