Бенифиты дизайна внутренних классов Java

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

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

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

Ответ 1

Внутренние классы хороши, когда они не используются вне класса-класса - это способ сокращения раздувания класса. Как правило, это единственный раз, когда я их использую.

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

Ответ 2

Внутренние классы полезны для:

  • Скрыть подробности реализации.

  • Сделать представление проекта более кратким и, следовательно, понятным.

  • Добавить логическую группировку связанного кода.

Ответ 3

Одно хорошее использование внутренних классов, которое приходит мне в голову, находится в java.util.ArrayList, который скрывает его реализации итераторов в private inner classes. Вы не можете создать их, за исключением вызова iterator() или listIterator() в объекте списка.

Таким образом реализации Iterator и ListIterator для ArrayList сгруппированы с их родственным классом и методами для повышения удобочитаемости (реализации довольно короткие), но скрыты от других.

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

public class ArrayList<E> extends AbstractList<E>
         implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
    ...
    public Iterator<E> iterator() {
         return new Itr();
    }

    private class Itr implements Iterator<E> {
    ...
    }

    public ListIterator<E> listIterator() {
         return new ListItr(0);
    }

    private class ListItr extends Itr implements ListIterator<E> {
    ...
    }
}

Ответ 4

Нестатический внутренний класс:
1) Внутренний класс будет использоваться для выполнения некоторой задачи над внешним классом и возвращает вывод
. Таким образом, он обеспечит создание внешнего объекта класса для доступа к нему.
2) Внутренний класс относится только к внешнему классу и не используется во внешнем мире. Поэтому не нужно думать о повторном использовании кода.

e.g_1). Лучшим примером для внутреннего класса является iterator реализация рамки коллекции. Set (AbstractCollection.java) и List (AbstractList.java) будут использовать другую реализацию внутреннего класса итератора.
- > Мы можем повторно использовать внутренний код класса. Например, реализация private class Itr innerclass at java.util.AbstractList используется как Arraylist, так и Vector.

Статический внутренний класс:
1) Статический внутренний класс не будет зависеть от объекта внешнего класса; но он специфичен для внешнего уровня класса. Он не будет подвергаться автономному, поскольку он специфичен только для внешнего класса. Поэтому повторное использование кода не требуется.
2) Он имеет группу методов, которая является общей (общей) для всех объектов (уровень класса) 3)

e.g_1) Восстановление объекта Sigleton с использованием статического внутреннего класса.
e.g_2) Шаблон Builder
e._3) реализация компаратора для класса.

Ответ 5

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