We have a given REST interface:
POST /calculation
<data>abc</data>
This calculation can be implemented by different logical "calculators" depending on the server config.
We are now designing the Java interface that each calculator must implement. The interface will have a method for each REST service.
Given that all REST (and HTTP) calls are stateless, each method should be static. However you can't define static methods in Java interfaces. Is there a good workaround for this situation?
We could define the methods as non static and then just first create an instance of the calculator class. It just seems cleaner to indicate that the methods are stateless by using the static keyword in the interface.
It seems to me that you want an interface with the methods declared as normal, and an implementing class, and then simply instantiate a single instance of this. There's no reason per se for the methods themselves to be static.
Stateless doesn't mean static. Stateless means that the component doesn't rely on state. I say component, because the whole implementation of your interface is actually stateless - it will not have any member variables. So multiple instances of the implementation classes are perfectly OK. Especially if you have a context to manage them - Spring or EJB for example.
Why do you think the methods should be static? They surely could be, but that would limit you in terms of plugging in a different implementation later. If you are concerned about memory consumption or the like, using a Singleton would do the same as static for you, as you already said in the last paragraph of your question.
If none of classes implementing this interface does not need to change the implementation, use static method
in interface as helper
method.
You won't need any workaround with java 8
version.
Java 8 supports static methods in interface. Have a look at this documentation page.
Static Methods:
In addition to default methods, you can define static methods in interfaces. (A static method is a method that is associated with the class in which it is defined rather than with any object. Every instance of the class shares its static methods.)
This makes it easier for you to organize helper methods in your libraries; you can keep static methods
specific to an interface
in the same interface
rather than in a separate class
Other solution to your problem is using Singleton
as suggested in accepted answer.