В общем, я не вижу проблем с этим. Закрытые внутренние классы являются частью реализации внешнего класса, поэтому инкапсуляция не нарушается. OTOH избавиться от дублирования - это хорошо.
AFAIK эта идиома много раз используется в библиотеке классов (в конце концов, она существует по какой-то причине :-), например при реализации Iterator
s в Collection Framework. Его типичное использование имеет следующие общие черты:
- вам нужно реализовать конкретный интерфейс без публикации конкретного класса реализации, однако
- реализация тесно связана с каким-то открытым классом (что делает их фактически компонентом ).
Реализация интерфейса в закрытом внутреннем классе прекрасно удовлетворяет обоим ограничениям, делая логическую зависимость двух классов явной и инкапсулируя класс реализации.