Внутренний интерфейс Java или ограничение доступа к методу с помощью вызывающего объекта - PullRequest
1 голос
/ 08 апреля 2010

Я использую Java. Я хочу иметь метод установки одного класса, который доступен только для «владеющего» объекта другого класса. Я буду более конкретным:

У меня есть интерфейсы Node и Port. Каждый узел имеет набор портов, и каждый порт принадлежит одному узлу. Порт может быть включен или отключен, обрабатывается с помощью простого логического свойства. Однако я хочу только разрешить узлу, который «владеет» портом, устанавливать его свойство enable / disabled. Это должно происходить при вызове Node.fixYourPorts () (ОК, у него другое имя, но я пытаюсь упростить).

Итак, я хочу, чтобы все могли вызывать port.isEnabled (), но только узел-владелец должен вызывать port.setEnabled ().

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

  1. Каждой реализации Node потребуется соответствующая реализация Port в том же пакете, а PortImpl.setEnabled () будет иметь пакетный доступ. Не гарантирует, что один узел не изменит порты другого узла, но это достаточно близко для меня. Код Node находится под моим большим контролем, чем любой случайный клиентский код, который может получить экземпляр порта.

  2. Вместо программирования на интерфейсный порт, программируйте на абстрактный базовый класс, AbstractPort, который является статическим вложенным классом внутри интерфейсного узла. Этот базовый класс будет предоставлять метод установки, поэтому реализации Node могут его вызывать. Не уверен, что это сработает.

  3. Напишите еще один слой кода поверх всего этого, через который клиент не сможет пробиться. Добавьте setEnabled в интерфейс порта. Слой кода сверху будет гарантировать, что установщик не выставлен.

  4. Добавьте установщик в интерфейс. Если вы как клиент включаете или отключаете порт самостоятельно, то вам нужно быть готовым к тому, что все будет работать некорректно. Добавить комментарий к этому эффекту.

Все это осложняется тем фактом, что реализации Node и Port будут сохранены в БД с использованием Hibernate.

Любая помощь?

Ответы [ 2 ]

4 голосов
/ 08 апреля 2010

Можете ли вы предоставить Port клиентским классам и предоставить его объекту Node с дополнительным интерфейсом, обеспечивающим метод установки? например создающий его компонент создаст (скажем) ConfigurablePort (расширение Port) и передаст его в Node, но передаст порт обратно клиенту как простое Port.

interface ConfigurablePort extends Port {
   void setValue();
}

// in some factory... Or perhaps in the Node itself?
public Port createPortForNode(Node node) {
   ConfigurablePort port = new Port();
   node.setPort(port);  // as Configurable
   return port; // as immutable
}

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

1 голос
/ 08 апреля 2010

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

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