@synapse_people

Как вызвать метод?

Добрый день!
Есть такой интерфейс:
public static interface Invokable {
	public void invoke();
};

и объект, который его реализует.
Каким образом можно добится того, чтобы этот метод можно было вызвать только из определенного места, а в других местах - нельзя(например, вылетало бы исключение)...?
Объясню зачем это нужно:
Есть модель, реализующая этот метод. Есть объект - сервер, который его будет вызывать.. Необходимо сделать так, чтобы пользователь не мог сам вызвать метод, а сервер - мог.
То есть, чтобы нельзя было написать model.invoke() и метод бы выполнился..
Подходит любая реализация задуманного.
Схема работы такая:
-сервер получает запрос и собирает Context, в котором инфа на пользователя и о подключении.
-объект контекста должен обязательно быть передан модели
-сервер вызывает invoke на определенной модели
Вопрос в том, как сделать так, чтобы пользователь не смог сам вызывать invoke!
Я думал сделать следующее:
класс ContextHolder с методами setCtx, getCtx.. Далее сервер вызывает Holder::setCtx, Model::invoke, а модель получает контект getCtx.... НО! Ведь пользователь тоже сможет вызвать setCtx.......... и все равно обойдет это.
*Объявлять метод как private, а потом при помощи рефлексии менять уровень доступа-не предлагать))
  • Вопрос задан
  • 334 просмотра
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Если invoke() обязан быть интерфейсным методом, то видится такое решение:
1) Интерфейс Invokable должен лежать в том же пакете, откуда он будет вызываться
2) В этом же пакете нужно создать некий package-private класс (проще всего - enum) с одним-единственным инстансом:
enum Lock { 
    LOCK;
 }

3) в метод invoke передавать Lock:
public static interface Invokable {
  public void invoke(@NonNull Lock lock);
};

4) В реализации дополнительно проверять переданный Lock на null
5) В месте "правильного" вызова передавать: model.invoke(Lock.LOCK);

Если метод invoke не обязан быть интерфейсным, то просто сделать его package-private и держать реализацию в том же пакете.

Но мне кажется, что где-то ошибка проектирования. Если изложишь задачу более подробно, можно найти более нормальное решение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы