У меня есть класс Outer
, который имеет класс private Inner
.
В моем методе класса Outer
я создаю экземпляр класса Inner
следующим образом:
Outer outer = new Outer();
Inner inner = outer.new Inner();
Компилятор преобразует этот код в:
Outer outer = new Outer();
Inner inner = new Inner(outer, null);
Использование отражения показывает, что класс Inner
имеет следующие синтезированные конструкторы:
private Outer$Inner(Outer)
Outer$Inner(Outer,Outer$Inner)
Поскольку класс Inner
равен private
, компилятор добавляет к нему конструктор private
, поэтому никто не может создать экземпляр этого класса. Но, очевидно, класс Outer
должен иметь возможность создавать экземпляр, поэтому компилятор добавляет другой конструктор частного пакета, который, в свою очередь, вызывает частный конструктор. Кроме того, поскольку конструктор package-private имеет это $
в своем имени, нормальный код Java не может его вызывать.
Вопрос: зачем синтезировать один частный и один конструктор private-private? Почему бы не синтезировать только конструктор package-private и не сделать с ним?