Происхождение синтаксиса Java для создания нового экземпляра внутреннего класса?

#java #syntax #inner-classes

#java #синтаксис #внутренние классы

Вопрос:

Мне любопытно, какой синтаксис выбран для создания экземпляра внутреннего класса с учетом экземпляра внешнего класса в Java.

Синтаксис:

 OuterClass.InnerClass innerObject = outerObject.new InnerClass();
  

Но почему это не:

 OuterClass.InnerClass innerObject = new outerObject.InnerClass(); 
  

Первое, по-видимому, подразумевает, что new — это метод или оператор, напрямую связанный с классом, но, насколько я понимаю, это не так (в отличие от C )?

Ответ №1:

Последнее означало бы для меня, что имя типа было outerObject.InnerClass — тогда как на самом деле typename просто InnerClass (или OuterClass.InnerClass , что также было бы законно) сконструировано по отношению к экземпляру, на который ссылается outerObject .

Лично мне в первую очередь не нравится, как Java создает вложенные классы, и я согласен, что это выглядит немного странно, но я могу понять, почему это сделано именно так.

Ответ №2:

Есть и другая причина.

 new o.C(); 
  

имеет два возможных значения. Это может означать создание внутреннего класса C в контексте внешнего объекта o . Это также может быть создание класса, полное имя которого o.C . Эта двусмысленность проблематична, тем более, что обе интерпретации могут быть допустимы одновременно.

Ответ №3:

Внутренний класс является подмножеством, во всех отношениях неотъемлемой частью внешнего класса. Внутренний класс может обращаться ко всем членам внешнего класса, как если бы они были одним целым. Аналогично, экземпляр (не static ) внутреннего класса должен быть неотъемлемой частью экземпляра внешнего класса. Он не может существовать сам по себе. Вы могли бы сравнить это с тем, как вы не можете получить доступ к нестатической переменной или функции с помощью MyClass.wyVariable .

Это поднимает вопрос о том, какой способ является наиболее семантически правильным способом представления этой взаимосвязи.

 OuterClass.InnerClass innerObject = new outerObject.InnerClass();
  

… утверждал бы (семантически), что InnerClass это каким-то образом свойство outerObject , которое после извлечения может свободно обрабатываться в мире за пределами области outerObject . new в этом случае не было бы ничего особенного.

Скорее InnerClass является частью OuterClass , в то время как экземпляр InnerClass должен быть частью экземпляра OuterClass из,,.

Приведенный выше синтаксис будет символизировать, что InnerClass (сам класс) является частью некоторого экземпляра OuterClass , что семантически неверно. В конце концов, существует только один класс InnerClass , даже если этот класс может иметь любое количество экземпляров.

 OuterClass.InnerClass innerObject = new OuterClass.InnerClass();
  

… конечно, также было бы (семантически) некорректно для не static внутренних классов, поскольку это никоим образом не отражает особых отношений любви и заботливости между экземплярами внутреннего и внешнего классов.

Однако обратите внимание, что этот синтаксис идеально подходит для static внутренних классов, поскольку они не имеют особого отношения ни к одному экземпляру внешнего класса. Это также прекрасно подходит при создании экземпляра внутреннего класса внутри его внешнего класса.

Наконец,

 OuterClass.InnerClass innerObject = outerObject.new InnerClass();
  

… лучше символизирует взаимосвязь. Это символизирует, что процесс создания экземпляра однозначно привязан к одному конкретному внешнему объекту, что и имеет место.