Сделайте Java-методы видимыми только для определенных классов
У меня есть класс менеджера, который отвечает за управление объектами определенного вида. Для этого ему необходимо манипулировать этими объектами, но эти объекты не имеют никакого отношения к менеджеру, поэтому с технической точки зрения они находятся в отдельных пакетах "project.managers" и "project.objects" . Важно то, что этими объектами должны манипулировать только менеджеры и нигде больше, но они должны быть доступны для всех остальных классов в проекте.
Поэтому я хотел бы, чтобы менеджеры имели доступ к манипулирующим методам, но ограничивали доступ для всех остальных классов. Наиболее очевидным было бы переместить класс менеджера и класс объектов в один и тот же пакет и объявить защищенные манипулирующие методы, но так как менеджеры и объекты являются совершенно отдельными объектами, они философски не вписываются туда.
(Это отчасти потому, что я хочу, чтобы моя среда IDE перестала показывать мне методы-манипуляторы всякий раз, когда я автозаполняю код на рассматриваемых объектах, поэтому мне всегда приходится идти по маршруту через менеджер, чтобы соответствующие таблицы корректно обновлялись при каждом изменении рассматриваемых объектов),
Есть ли какие-то идеи на этот счет или очевидный путь лучше всего в любом случае?
3 ответа
Почему бы не иметь интерфейс под названием
ManagerFunctions
а другой называется
ClientFunctions
Вы управляемые объекты будут реализовывать оба из них.
Когда вы создаете управляемые объекты, вы передаете их, но только как ссылки на ClientFunctions
, Однако объекты менеджера будут называться ими как ManagerFunctions
и, следовательно, иметь доступ к своим "управляемым" функциям. Соответствующий кастинг просто выставит соответствующие методы.
Ваша IDE автоматически представит вам соответствующие методы в зависимости от того, как на эти объекты ссылаются.
Поэтому я хотел бы, чтобы менеджеры имели доступ к манипулирующим методам, но ограничивали доступ для всех остальных классов. Наиболее очевидным было бы переместить класс менеджера и класс объекта в один и тот же пакет и объявить защищенные манипулирующие методы...
Технически, вы бы объявили пакет манипулирующих методов защищенным (без модификатора вообще). Защищенные методы позволяют расширять класс проще.
но так как менеджеры и объекты являются совершенно отдельными объектами, они философски не вписываются туда.
Я понимаю. У Java нет объявления "друга", которое есть в C++.
Вы можете прокомментировать манипулирующие методы, но это не решит проблему Eclipse.
Вы просите что-то похожее на объявления "друга" в C++, но в Java нет прямого эквивалента - видимость пакета самая близкая. В качестве альтернативы вы могли бы пойти на модель, такую как XML DOM, где методы, которые должны быть общедоступными, определены в интерфейсах, и весь доступ клиентов осуществляется через эти интерфейсы. Менеджер будет знать конкретный класс реализации, поэтому может понизить его до необходимого уровня.