I have an interface with only a single method that could be replaced by java.util.function.Function from the JDK:
interface DataModel {
boolean apply(Map<String, Integer> input);
}
The replacement would be
Function<Map<String, Integer>, Boolean>
However, I wonder whether I should keep this interface since at least one implementation (other implementations might follow) contains mutable state and is not thread safe. A factory creates a new instance for each call.
So while technically possible, the functional interface might semantically not the best solution.
The API documentation doesn't say something about mutability, but maybe it would violate the principle of least astonishment or some other kind of contract. Is there any such contract?
Would you go with Function
or with the custom DataModel
interface and why?
1 Answer 1
I would got for DataModel
interface, to avoid future missunderstandings and problems.
I not a Imperative/OO or Functional purist, but I think keeping things clear is a good thing.
@FunctionalInterface
s has it's own purposes, I think custom interfaces always will fit better for "concrete implementations"; you own them, so you can extend and document them whenever you want or need.
Finally, try to avoid this scenario: "a new change will force us to migrate Funtion
s implementations to BiFunction
s, or anything else"; imagine the refactorings...
Something you can do is extend Function
, to have your own copy of the interface and reuse default methods if needed:
public interface DataModel<T, R> extends Function<T, R> {}
-
Tanks, I go with my plain
DataModel
interface since it is only accidentally a functional interface.deamon– deamon2017年12月20日 08:44:17 +00:00Commented Dec 20, 2017 at 8:44
Explore related questions
See similar questions with these tags.
Function
or not. If you are doing functional programming where you have to provide a function, I would lean toward theFunction
interface since that speaks toward the functional mindset better. If I'm in a more DDD environment I would probably favorDataModel
. Context is everything.