Обход статического метода интерфейса Java?

У нас есть заданный интерфейс REST:

POST /calculation
<data>abc</data>

Этот расчет может быть реализован различными логическими «калькуляторами» в зависимости от конфигурации сервера.

Сейчас мы разрабатываем интерфейс Java, который должен реализовать каждый калькулятор. Интерфейс будет иметь метод для каждой службы REST.

Учитывая, что все вызовы REST (и HTTP) не имеют состояния, каждый метод должен быть статическим. Однако вы не можете определять статические методы в интерфейсах Java. Есть ли хороший обходной путь для этой ситуации?

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


person Marcus Leon    schedule 12.11.2009    source источник


Ответы (4)


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

person Brian Agnew    schedule 12.11.2009

Без состояния не означает статическое. Без состояния означает, что компонент не зависит от состояния. Я говорю компонент, потому что вся реализация вашего интерфейса на самом деле не имеет состояния — она не будет иметь никаких переменных-членов. Таким образом, несколько экземпляров классов реализации вполне допустимы. Особенно, если у вас есть контекст для управления ими — например, Spring или EJB.

person Bozho    schedule 12.11.2009

Как вы думаете, почему методы должны быть статическими? Они, конечно, могут быть, но это ограничило бы вас с точки зрения подключения другой реализации позже. Если вас беспокоит потребление памяти или тому подобное, использование Singleton сделает для вас то же самое, что и статическое, как вы уже сказали в последнем абзаце вашего вопроса.

person Daniel Schneller    schedule 12.11.2009

Если ни один из классов, реализующих этот интерфейс, не нуждается в изменении реализации, используйте static method в интерфейсе как метод helper.

Вам не понадобится обходной путь с версией java 8.

Java 8 поддерживает статические методы в интерфейсе. Посмотрите эту документацию на странице.

Статические методы:

В дополнение к методам по умолчанию вы можете определить статические методы в интерфейсах. (Статический метод — это метод, связанный с классом, в котором он определен, а не с каким-либо объектом. Каждый экземпляр класса использует свои статические методы.)

Это упрощает организацию вспомогательных методов в ваших библиотеках; вы можете оставить static methods специфичным для interface в том же interface, а не в separate class

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

person Ravindra babu    schedule 18.02.2016