Модульность в Java: верхний уровень против вложенных классов

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

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

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

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

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

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


person an00b    schedule 18.03.2011    source источник


Ответы (4)


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

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());
    }
}
person gpeche    schedule 18.03.2011

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

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

person Peter Lawrey    schedule 18.03.2011
comment
Lawery, а также взлом кода в управляемых файлах повышает производительность системы. - person palAlaa; 18.03.2011
comment
@Alaa, делая классы более управляемыми, вы можете получить больше времени для улучшения таких вещей, как производительность. Более простой короткий код часто работает быстрее, но я не думаю, что использование больших классов оказывает прямое влияние на производительность. - person Peter Lawrey; 18.03.2011
comment
Lawery, я знал, что это влияет на индексацию файлов. - person palAlaa; 18.03.2011

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

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

person Andy Thomas    schedule 18.03.2011

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

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

person Dheeru Mundluru    schedule 28.02.2014