Вопрос о публичных внутренних классах - PullRequest
2 голосов
/ 17 февраля 2011

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

    public class A{
              private class B
              private class C
              private class D
              :
              :

    public class B{
    }

    public class c{
    }

    public class D{
    }
}

Поэтому, когда я спросил разработчика о том, почему она использовала внутренние классы, она сказала мне, поскольку эти классы будут использоваться ТОЛЬКО этим классом, она сделала это таким образом, что, я согласен, является веской причиной,

Однако этот класс стал "длинным" (около 200 строк методов получения и установки, включая определения классов 4-5) с множеством внутренних классов. Хотя я согласен с ее причиной, я обеспокоен продолжительностью класса. Мне почти хочется сказать ей удалить внутренние классы и сделать их собственными, но на данный момент единственное преимущество - это уменьшает размер класса.

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

Ответы [ 3 ]

2 голосов
/ 17 февраля 2011

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

Из oracle java tutorial:

Логическая группировка классов - если класс полезентолько одному другому классу, тогда логично встраивать его в этот класс и хранить их вместе.Вложение таких «вспомогательных классов» делает их пакет более упорядоченным.

Увеличенная инкапсуляция - рассмотрим два класса верхнего уровня, A и B, где B необходим доступ к членам A, которые иначе были бы объявлены закрытыми.Скрывая класс B в классе A, члены A могут быть объявлены частными, и B может получить к ним доступ.Кроме того, сам B может быть скрыт от внешнего мира.

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

1 голос
/ 17 февраля 2011

Если единственная причина наличия внутреннего класса (не путать со статическими внутренними классами) состоит в том, чтобы уменьшить видимость B, C и D, возможно, собирая все классы в одном пакете и используя пакет приватный модификатор видимости (т.е. вообще не модификатор) будет достаточно?

package com.example

public class A {
}

class B {
}

class c {
}

class D {
}

Теперь во всем проекте доступен только класс A, тогда как B, C и D доступны только в пакете com.example.Пожалуйста, помните, что использование внутренних классов имеет цену хранения дополнительной неявной this ссылки на родительский класс (A в этом примере).

0 голосов
/ 17 февраля 2011

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

...