Доступ к методам / полям в публичном классе из частного класса - PullRequest
1 голос
/ 17 января 2011

Это плохая практика или «тупой» доступ к методам / полям, которые являются закрытыми в общедоступном классе из частных классов в одном и том же файле. В моем случае у меня есть метод, который добавляет компоненты в моем GUI к панелям (GridBagLayout), поэтому я создал метод для этого. Однако у меня есть три панели, поэтому вместо создания метода addComponent в каждом закрытом классе у меня есть закрытый метод addComponent в открытом классе.

Это обзор моего класса:

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

Итак, вернемся к моему вопросу, это хороший / плохой способ сделать это?

Заранее спасибо.

Ответы [ 6 ]

4 голосов
/ 17 января 2011

Частный внутренний класс является частью публичного "внешнего" класса.Поэтому доступ к закрытым членам внешнего класса вполне приемлем.

3 голосов
/ 17 января 2011

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

AFAIK эта идиома много раз используется в библиотеке классов (в конце концов, она существует по какой-то причине :-), например при реализации Iterator s в Collection Framework. Его типичное использование имеет следующие общие черты:

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

Реализация интерфейса в закрытом внутреннем классе прекрасно удовлетворяет обоим ограничениям, делая логическую зависимость двух классов явной и инкапсулируя класс реализации.

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

Это зависит.

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

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

  • Это нетривиальный вложенный класс.
  • Если вы когда-нибудь захотите переместить вложенный класс, например, в класс верхнего уровня.
2 голосов
/ 17 января 2011

Это отлично.

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

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

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

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

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

...