2013-04-18 4 views
12

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

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

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

+2

Вы действительно имеете в виду внутренние классы или [статические] вложенные классы? –

+1

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

+0

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

ответ

12

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

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

+0

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

+0

Есть ли какие-либо преимущества или недостатки для тестирования ? –

+0

Мое чтение «Эффективная Java» подтверждает ваши комментарии. Спасибо! –

2

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

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

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

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

1

Одно хорошее использование внутренних классов, которая приходит мне в голову в 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> { 
    ... 
    } 
} 
1

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

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

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

e.g_1) Sigleton объект считывания с помощью статического внутреннего класса.
e.g_2) Builder Pattern
e.g_3) Реализация компаратора для класса.

0

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