Преимущества внутреннего класса в серверном приложении - PullRequest
2 голосов
/ 27 августа 2010

Какая польза от внутреннего класса в приложении на стороне сервера Java?Пожалуйста, объясните преимущества, кроме иерархии содержания компонента Swing, используя внутренний класс.

Ответы [ 4 ]

1 голос
/ 27 августа 2010

Я следую общему практическому правилу использования внутренних классов для случаев, когда функциональность дискретна по отношению к содержащему классу и функциональность вряд ли может быть повторно использована за пределами содержащего класса.

1 голос
/ 27 августа 2010

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

1 голос
/ 27 августа 2010

Некоторые классы выполняют определенные задачи.

Я написал несколько внутренних классов в приложениях на стороне сервера, таких как SpecificPageValidator.Обычно некоторые Валидаторы проверяют то или иное.Но эта страница дает очень особые данные.Поскольку мне сказали, что ни одна другая страница не выдаст эти редкие входные данные, я написал их как внутренние классы и не публикую их ни в одном пакете.

Другой пример - написать класс, подобный WeirdEventListener, который разрешен только на страницеили два.

В конце концов, написание некоторых внутренних классов может считаться «трудным в обслуживании», поскольку (обычно) никто, кроме самого Программиста, не знает об этом.

1 голос
/ 27 августа 2010

Преимущества анонимных внутренних классов точно такие же, как и для Swing;то есть они позволяют вам осуществлять обратные вызовы без «накладных расходов на программирование» отдельного файла класса.

Конечно, это все синтаксический сахар.Скомпилированный код (и производительность) для двух подходов практически одинаков.Действительно, JVM не проводит никаких различий между обычными и внутренними / вложенными классами.

Все внутреннее / внешнее содержимое области видимости разрешается во время компиляции и переводится в скрытый параметр конструктора и скрытую переменную во внутреннем экземпляреэто относится к внешнему экземпляру.Вы можете смоделировать все это самостоятельно во вложенных классах, кодируя явные параметры / переменные.Следовательно, это синтаксический сахар.

Единственное, что вы можете сделать с внутренними классами, что вы не можете сделать с отдельными классами, - это доступ к закрытым членам.Чтобы добиться этого, используя отдельные классы, вам нужно изменить соответствующие закрытые члены на пакеты private.Но я бы все равно отнес это к синтаксическому сахару ... или достаточно близко.

...