Mam klasę Outer
, która ma klasę private Inner
.Java: prywatni konstruktorzy z syntezatorami wewnętrznymi
W moim Outer
metody klasy, I instancji klasy Inner
następująco:
Outer outer = new Outer();
Inner inner = outer.new Inner();
Kompilator konwertuje ten kod:
Outer outer = new Outer();
Inner inner = new Inner(outer, null);
Korzystanie odbicie pokazuje, że klasa Inner
ma następującą syntetyzowane konstruktorzy:
private Outer$Inner(Outer)
Outer$Inner(Outer,Outer$Inner)
Ponieważ klasa Inner
to private
, kompilator dodaje do niej konstruktora private
, aby nikt nie mógł utworzyć wystąpienia tej klasy. Oczywiście klasa Outer
powinna mieć możliwość utworzenia instancji, więc kompilator dodaje inny prywatny konstruktor pakietu, który z kolei wywołuje prywatny konstruktor. Ponadto, ponieważ konstruktor prywatny pakietu ma w swojej nazwie nazwę $
, normalny kod Java nie może go wywołać.
Pytanie: dlaczego syntetyzować jeden prywatny i jeden pakiet-prywatny konstruktor? Dlaczego nie zsyntetyzować tylko prywatnego konstruktora pakietu i z tym skończyć?
@Noofiz te konstruktory są tworzone przez kompilator, bez potrzeby jawnego kodowania ich; stąd nazwałem je syntetyzowanymi. – shrini1000
@Noofiz Jeśli nie rozumiesz pytania, które sugeruję, zostaw to tym, którzy to robią. – EJP
Czy 'Outer $ Inner (zewnętrzny, zewnętrzny Inner)' naprawdę działa poprawnie? Konstruktor otrzymuje instancję tej samej klasy co argument? Dlaczego kompilator powinien dodać taki parametr? –