Когда я должен использовать / примеры вложенных классов? - PullRequest
2 голосов
/ 11 октября 2009

Пожалуйста, пометьте этот вопрос, чтобы включить языки, к которым он относится

Так что в моей java-книге была целая глава о вложенных классах, но она закончилась замечанием, что вы должны действительно использовать их только в том случае, если речь идет о «моделировании композиционных отношений и реализации внутренних элементов класса, который вы хотите скрыть». Итак, давайте обсудим, когда вы захотите использовать вложенные классы, и несколько примеров.

Ответы [ 3 ]

3 голосов
/ 11 октября 2009

Вложенный / внутренний класс - это просто класс, который используется только в контексте другого класса, у которого нет собственного файла класса. Если он связан с экземпляром, он может быть создан только в контексте экземпляра родительского класса; он может видеть личные данные или только частные статические данные, если это статический класс.

Сайт разработчика Java имеет учебное руководство по вложенным классам с одним примером: http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html

Несколько примеров использования:

  • Скрыть конкретную реализацию Интерфейс:

(Думая о сеансе базы данных для такого инструмента, как Hibernate): Предположим, у вас есть интерфейс Session и SessionFactory, который возвращает экземпляр Session. Конкретный класс SessionImpl, который реализует интерфейс Session, может быть внутренним классом фабрики, который знает, как его создать и инициализировать.

  • Предоставление информации путем реализации Интерфейс:

В веб-платформе Wicket каждый компонент с графическим интерфейсом имеет связанную «модель», задачей которой является привязка данных к компоненту. Интерфейс выглядит примерно так:

public interface IModel extends IDetachable {
 public Object getObject();
 public Object setObject();
}

Предположим, у вас есть специальная логика для извлечения данных для пользовательского компонента GUI, который вы написали. Поскольку никакой другой компонент не получает данные таким же образом, вы можете использовать анонимный класс в точке, где предоставляется IModel, для обеспечения извлечения данных. Если у вас есть другая точка в том же классе, где вам нужно повторно использовать реализацию IModel, вы можете сделать ее внутренним классом. Позже, если вам нужна модель в другом месте, вы можете преобразовать ее в класс верхнего уровня.

Обычно вы используете внутренний класс в ситуации, когда вам нужно определение класса, но этот класс можно использовать только или имеет смысл только в контексте родительского класса.

3 голосов
/ 11 октября 2009

Реальное использование, которое я имел с вложенными классами, было в объекте глобальных настроек.

Родительским классом был Singleton с вложенными классами в качестве категорий настроек.

  • Настройки
  • Настройки файла
  • Настройки печати
  • Etc.

Не было никакого смысла делать внутренний объект как отдельные классы, так как они не будут использоваться для них вне области действия класса настроек.

2 голосов
/ 11 октября 2009

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

   public partial class Network
    {
            partial void initFDLF()
            {
                fdlf=new FDLF(this);
            }

        public FDLF fdlf;
        public class FDLF
        {
            internal bool changed=true;
            internal bool pvchange=true;
            public double epsilon = 0.001;
            public bool fdlfOk=false;
            public void init(){...}
            public void run(){...}
            ...
...