Идиома программирования на 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 для этого.)