Модульность в Java: верхний уровень против вложенных классов - PullRequest
5 голосов
/ 18 марта 2011

Учебники по Java, которые я читаю, любят использовать вложенные классы для демонстрации концепции, функции или использования.

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

Это работает, но теперь я получил чудовищный монолитный файл .java.Я нахожу это несколько неудобным, и теперь я намереваюсь разбить на несколько файлов / классов .java.

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

Если да, то какие веские причины держать модуль большим, учитывая модульность и простоту обслуживания?

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

Ответы [ 4 ]

4 голосов
/ 18 марта 2011

Проще прочитать все классы, если они находятся в одном файле. Вот почему этот подход хорош, например, для кода.

Однако для реального кода вы должны разбить ваши файлы / классы на управляемые размеры. Самый длинный файл классов в Java 6 имеет длину около 9000 строк. Я склонен держать классы короче, чем это. ;)

2 голосов
/ 18 марта 2011

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

public class Outer {
    private String s;

    public void setS(String s) {
        this.s = s;
    }

    public class Inner {
        public String getOuterS() {
            // This is legal only if Inner is
            // non-static and nested in Outer
            return s;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.setS("Hello world!!!");

        // i now has access to every o member
        Outer.Inner i = o.new Inner();

        // Prints "Hello world!!!"
        System.out.println(i.getOuterS());
    }
}
1 голос
/ 28 февраля 2014

В дополнение к преимуществу замыкания (уже указанному в другом ответе), вложенные классы также помогают достичь множественного наследования реализации (ссылка: Мышление в Java, стр. 369 - раздел «Почему внутренние классы») «?). Насколько я знаю, другого способа достичь этого нет. Итак, если ваш вложенный класс помогает вам достичь множественного наследования реализации, то вы не сможете сделать вложенный класс верхнего уровня.

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

1 голос
/ 18 марта 2011

Да. Внутренние классы (нестатические вложенные классы) могут ссылаться на переменные экземпляра содержащего класса.

Кроме того, вложенные классы могут иметь доступ к закрытым членам содержащего класса.

...