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

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

Есть ли какая-то выгода иметь частный статический класс, реализующий A? Это напомнило мне идиому Pimpl в C++. Есть ли польза от использования идиомы 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и приятно иметь возможность легко получить экземпляр через публичное статическое поле.

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

Другие вопросы по тегам