Внутренний класс как часть внешнего класса - PullRequest
0 голосов
/ 09 января 2019

Давайте предположим, что у меня есть магазин игрушек. И у меня есть веб-страница, где можно купить эти игрушки. У каждой игрушки есть свои особенности, но для представления игрушки-человека у меня есть класс HumanToy с некоторыми свойствами, такими как высота, вес .... Но у меня есть вложенное свойство, которое само по себе является JavaBean с именем HumanLegs, и этот класс имеет свои особенности, такие как:

public class HumanToy {     

    private Double height;
    private Double weight;

    private HumanLegs humanLegs;

    private class HumanLegs {

        private Double height;
        private Double weight;
    }

Мой вопрос будет:

Имеет ли какой-то смысл, что эта игрушка имеет статический HumanLegs класс? Я имею в виду, концептуально, HumanLegs не может существовать сам по себе, они существуют только с игрушкой, поэтому я считаю логичным, что это, во-первых, внутренний класс (не отдельный класс), а во-вторых, не статичный по той же причине, я значит, только создав экземпляр HumanToy, вы можете получить объект HumanLegs или получить объект HumanLegs, вам нужен объект HumanToy. Это правильное мышление?

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Нестатические классы-члены влекут за собой снижение производительности и могут усложнить понимание кода. Как и другие функции языка программирования, они должны использоваться только при необходимости. Это означает, что если вы можете организовать свой дизайн так, чтобы не требовалось, чтобы экземпляры HumanLegs переходили к соответствующему включающему экземпляру HumanToy, тогда лучше объявить HumanLegs как статический член-класс.

Эта интуиция отражена в пункте 24 в Effective Java, 3-е издание:

Если вы объявляете класс-член, который не требует доступа к включающему экземпляру, всегда помещает модификатор static в его объявление.

Это отдельно от вопроса о существовании, упомянутого в этом вопросе. Объявляя HumanLegs private, объявление HumanToy может контролировать, что экземпляры HumanLegs не создаются вне контекста HumanToy экземпляра.

0 голосов
/ 09 января 2019

Да, это имеет смысл, потому что HumanLegs сохраняет ссылку на его внешний класс. Если вы переместите экземпляр HumanLegs в другой экземпляр HumanToy, исходный HumanToy не будет удален, поскольку HumanLegs сохраняет ссылку на него.

Таким образом, внешний класс хранится в памяти как минимум столько же, сколько все экземпляры внутреннего класса.

...