Сделайте Java-методы видимыми только для определенных классов

У меня есть класс менеджера, который отвечает за управление объектами определенного вида. Для этого ему необходимо манипулировать этими объектами, но эти объекты не имеют никакого отношения к менеджеру, поэтому с технической точки зрения они находятся в отдельных пакетах "project.managers" и "project.objects" . Важно то, что этими объектами должны манипулировать только менеджеры и нигде больше, но они должны быть доступны для всех остальных классов в проекте.

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

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

Есть ли какие-то идеи на этот счет или очевидный путь лучше всего в любом случае?

3 ответа

Решение

Почему бы не иметь интерфейс под названием

ManagerFunctions

а другой называется

ClientFunctions

Вы управляемые объекты будут реализовывать оба из них.

Когда вы создаете управляемые объекты, вы передаете их, но только как ссылки на ClientFunctions, Однако объекты менеджера будут называться ими как ManagerFunctions и, следовательно, иметь доступ к своим "управляемым" функциям. Соответствующий кастинг просто выставит соответствующие методы.

Ваша IDE автоматически представит вам соответствующие методы в зависимости от того, как на эти объекты ссылаются.

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

Технически, вы бы объявили пакет манипулирующих методов защищенным (без модификатора вообще). Защищенные методы позволяют расширять класс проще.

но так как менеджеры и объекты являются совершенно отдельными объектами, они философски не вписываются туда.

Я понимаю. У Java нет объявления "друга", которое есть в C++.

Вы можете прокомментировать манипулирующие методы, но это не решит проблему Eclipse.

Вы просите что-то похожее на объявления "друга" в C++, но в Java нет прямого эквивалента - видимость пакета самая близкая. В качестве альтернативы вы могли бы пойти на модель, такую ​​как XML DOM, где методы, которые должны быть общедоступными, определены в интерфейсах, и весь доступ клиентов осуществляется через эти интерфейсы. Менеджер будет знать конкретный класс реализации, поэтому может понизить его до необходимого уровня.

Другие вопросы по тегам