Java: синтезированные конструкторы закрытого внутреннего класса [дубликаты]
На этот вопрос уже есть ответ здесь:
Почему анонимный внутренний класс не содержит ничего, сгенерированного из этого кода? 5 ответову меня есть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
класс должен иметь возможность его создания, поэтому компилятор добавляет этот частный конструктор другого пакета, который в свою очередь вызывает частный конструктор. Кроме того, так как у конструктора пакета есть$
по своему названию нормальный код Java не может его вызвать.
Вопрос: зачем синтезировать один закрытый и один частный конструктор пакетов? Почему бы не синтезировать только конструктор частного пакета и покончить с этим?