хороший стиль программирования, два класса, использующие внутренние классы друг друга - PullRequest
8 голосов
/ 20 мая 2011

У меня есть класс A с его внутренним классом, определенным A1, и класс B с его внутренним классом, определенным B1. Как вы думаете, это нормально, что класс A в своей реализации относится к B1, а класс B относится к A1. Разве это не плохой стиль программирования? Просто A1 - это очень специфичный класс, а B1 - очень специфичный класс B, поэтому я связал их. Можно ли так оставить, или лучше иметь А1 и В1 в качестве отдельных классов? Как вы думаете? Thx.

Ответы [ 5 ]

6 голосов
/ 20 мая 2011

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

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

6 голосов
/ 20 мая 2011

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

Я бы на самом деле просто выделил A1 и B1 как свой собственный класс - мне кажется, A1 и B1 не настолько специфичны для A и B послевсе, поскольку A1 используется B, а B1 используется A.

Посмотрите на этот пост Почему / когда следует использовать вложенные классы "Использовать вложенный класс, когдавложенный класс полезен только для включающего класса "

2 голосов
/ 20 мая 2011

Возможно, я бы попробовал две вещи:

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

  2. Создайте некоторые интерфейсы, чтобы A и B не знали, по крайней мере, где находятся классы A1 и B1.

1 голос
/ 20 мая 2011

Я думаю, что вы задали два отдельных вопроса о дизайне в одном.Первый вопрос касается ссылки на внутренние классы другого класса.Второй вопрос касается циклической зависимости между A / A1 и B / B1.

Открытые внутренние классы

Есть много причин для использования Java внутренние классы.

  1. Групповые классы, которые относятся только друг к другу и внешнему классу.(мини-пакет)
  2. Сокращение стандартного кода при передаче и обращении к экземплярам внешнего класса
  3. Добавление дополнительного уровня области видимости помимо пакета
  4. Расширение семантики области доступа Java... например, private имеет другое значение для взаимодействия между внешним классом и внутренним классом.
  5. Сокращение количества исходных файлов ... особенно в сценариях генерации (исходного) кода.
  6. Доступ к внутренним компонентам внешнего класса для тестирования (внутренний класс может быть удален во время упаковки JAR).

При многих из этих обстоятельств обращение к внутреннему классу по имени совершенно разумно.

Круговая зависимость

Чаще всего это признак необходимости извлечения интерфейсов или извлечения других специализированных классов. Если A1, B1 слишком просты для извлечения интерфейсов и т. Д., Возможно, вы можете использовать внутренние классы другим способом: иметь внешний класс C, содержащий A1, B1.

1 голос
/ 20 мая 2011

Я бы сказал, если оба класса находятся в одном пакете, извлеките внутренние классы и сделайте их закрытыми. Таким образом, оба класса (A и B) могут ссылаться на них, но все же они невидимы для других классов вне пакета.

...