更改功能接口方法名称的最聪明方法是什么?

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.