更改功能接口方法名称的最聪明方法是什么?
What is the smartest way to change functional interfaces method name?
不知何故,我有一些要求使用预先编写的默认方法的所有好处并将抽象方法(apply(T t)
)从Java更改为Function<T, R>
。
如果我选择 make new @FunctionalInterface
extends Function<T, R>
,方法名称将是 operate(T t)
,我想我的代码会像下面这样,
@FucntionalInterface
public interface CustomOperator<T, R> extends Function<T, R>{
R operate(T t);
@override
default R apply(T t){
//do something
}
}
假设所有使用 CustomeOperator
的客户端代码只调用 operate(T t)
,如果我希望接口具有与 Function<T ,R>
的默认方法相同的所有好处请提供,填写“//do something
”部分的最佳方法是什么?
我想知道继承是否不是满足我要求的最聪明(或可能)的方式。
只有一种合理的实现:
@Override
default R apply(T t) {
return operate(t);
}
...这样做是完全正常的。
填充 //do something
space 的代码相当简单:您委托给抽象方法:
@Override
default R apply(T t) {
return this.operate(t);
}
丑陋的部分是您需要注意和记住的所有内容(所有这些都是因为 Function
的合同仍将对您的客户可见):
Sub-interfaces 并实施 CustomOperator
的 类 可以 覆盖 apply
,并且您可以'不要让它成为最终版本。
您必须从函数中覆盖所有这些 default
方法,例如:
@Override
default <V> CustomOperator<V, R>
compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before); //validation to replicate
return (V v) -> apply(before.apply(v)); //or operate()
}
你需要这样做,因为你的呼叫者使用 CustomOperator
,这当然不包含在继承的 Function.compose
中。
当 java.util.function.Function<T, R>
进化(并且应该进化)时,您需要跟上。
以上挑战更多是针对您的要求提出的问题。你为什么需要这样做?这是可能的,但随之而来的是维护工作。
而且,由于您已经需要重写 Function
中的所有 default
方法,这里有一个很好的问题要问:为什么不 解决问题遗产?您可以复制合约,但让 CustomOperator
独立于 Function
.
不知何故,我有一些要求使用预先编写的默认方法的所有好处并将抽象方法(apply(T t)
)从Java更改为Function<T, R>
。
如果我选择 make new @FunctionalInterface
extends Function<T, R>
,方法名称将是 operate(T t)
,我想我的代码会像下面这样,
@FucntionalInterface
public interface CustomOperator<T, R> extends Function<T, R>{
R operate(T t);
@override
default R apply(T t){
//do something
}
}
假设所有使用 CustomeOperator
的客户端代码只调用 operate(T t)
,如果我希望接口具有与 Function<T ,R>
的默认方法相同的所有好处请提供,填写“//do something
”部分的最佳方法是什么?
我想知道继承是否不是满足我要求的最聪明(或可能)的方式。
只有一种合理的实现:
@Override
default R apply(T t) {
return operate(t);
}
...这样做是完全正常的。
填充 //do something
space 的代码相当简单:您委托给抽象方法:
@Override
default R apply(T t) {
return this.operate(t);
}
丑陋的部分是您需要注意和记住的所有内容(所有这些都是因为 Function
的合同仍将对您的客户可见):
Sub-interfaces 并实施
CustomOperator
的 类 可以 覆盖apply
,并且您可以'不要让它成为最终版本。您必须从函数中覆盖所有这些
default
方法,例如:@Override default <V> CustomOperator<V, R> compose(Function<? super V, ? extends T> before) { Objects.requireNonNull(before); //validation to replicate return (V v) -> apply(before.apply(v)); //or operate() }
你需要这样做,因为你的呼叫者使用
CustomOperator
,这当然不包含在继承的Function.compose
中。当
java.util.function.Function<T, R>
进化(并且应该进化)时,您需要跟上。
以上挑战更多是针对您的要求提出的问题。你为什么需要这样做?这是可能的,但随之而来的是维护工作。
而且,由于您已经需要重写 Function
中的所有 default
方法,这里有一个很好的问题要问:为什么不 解决问题遗产?您可以复制合约,但让 CustomOperator
独立于 Function
.