采用和返回相同类型的方法管道

Pipeline of methods taking and returning the same type

在数据清理应用程序中,我有一系列方法,每个方法都接受一个自定义对象,returns 它经过一些处理。

我知道将这些方法中的每一个都放在自己的 class 中并将它们链接在一起的设计模式,但我对拆分这个 class 不感兴趣。它是一个 class 中间的几行代码,嵌在一个相当大的 Java 整体中。出于同样的原因,我不会为这一小段代码包含来自 Scala 或其他函数式语言的单个模块。

方法必须以正确的顺序实施,因为每个方法的逻辑都取决于已经完成的工作。因此,我给了他们新的编号名称,这是我希望保留的编号顺序。

目前我的代码如下所示:

customObject = method1(customObject);
customObject = method2(customObject);
customObject = method3(customObject);
customObject = method4(customObject);
customObject = method5(customObject);
customObject = method6(customObject);

是否有更流畅的方式将它们链接在一起,而不颠倒它们在代码中出现的顺序?换句话说,我已经驳回了以下可能具有误导性的内容(真正的方法名称不会显示它们是向后列出的):

customObject = method6(method5(method4(method3(method2(method1(customObject))))));

customObject = method6(customObject)
 = method5(customObject)
 = method4(customObject)
 = method3(customObject)
 = method2(customObject)
 = method1(customObject);

(在任何情况下,除了读取时颠倒顺序外,后者是无效的 Java 代码,因为如果右侧有方法调用,编译器需要左侧的变量)

是一小段代码的小问题。我怀疑答案是 'no',因为每行的处理方式都是从右到左(进入方法参数,并分配给左侧的变量名)。但是我无法摆脱这种挥之不去的感觉,我可能在语言中遗漏了一些东西,这些东西可以让这些方法调用的链接更优雅。也许这是Java做不到的事情。

您可以使用 fluent interface 模式。像这样:

dataCleaner
    .method1(customObject)
    .method2(customObject)
    .method3(customObject)
    .method4(customObject)
    .method5(customObject)
    .method6(customObject)

dataCleaner 上的每个方法 returns this 例如

public DataCleaner method1(CustomObject customObject) {
    // do some cleaning ...
    // ...
    return this;
}

备注:

  • 这假设每个方法都以这样一种方式变异 customObject,即它已准备好成为下一个方法的输入。根据您展示当前代码的方式,我认为这个假设是有效的。如果这无效,那么您可以使 DataCleaner 有状态并通过 class 成员在离散方法之间共享状态,也许是这样的:

    CustomObject clean = new DataCleaner(customObject)
        .method1()
        .method2()
        .method3()
        .method3()
        .method5()
        .method6()
        .get();
    
  • 可以说上述方法只是方法链接而不是正式的流畅接口,但您的实际实现可能 return 某些东西或可能有一些需要额外的方法上下文等所有这些都会使它更接近流畅界面的规范形式。撇开如何描述这种模式的语义不谈,它至少能让你整理代码,并以一种易于理解的方式表达这一系列方法之间的依赖关系。