gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:49:27 24 4
gpt4 key购买 nike

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

我知道将这些方法中的每一个都放在自己的类中并将它们链接在一起的设计模式,但我对拆分这个类不感兴趣。它是嵌入在相当大的 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 代码,因为如果右侧有方法调用,编译器要求左侧有变量)

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

最佳答案

你可以使用 fluent interface图案。像这样:

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

dataCleaner 上的每个方法都返回 this,例如

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

注意事项:

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

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

关于java - 采用和返回相同类型的方法管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46253606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com