方法链接的优点和缺点以及用对象本身替换所有 void 返回参数的可能性

2024-05-02

我最感兴趣的是Java,但我认为这是一个普遍的问题。最近我一直在使用 Arquillian 框架(ShrinkWrap)使用了大量的方法链。方法链的其他示例是以下方法StringBuilder, StringBuffer。使用这种方法有明显的好处:减少冗长就是其中之一。

现在我想知道,为什么不是所有的方法都有void返回参数实现为可链接的?链接一定存在一些明显且客观的缺点。因为如果所有方法都是可链接的,我仍然可以选择不使用它。

我并不是要求更改 Java 中的现有代码,这可能会破坏某些地方,但解释一下为什么不使用它也很好。我更多的是从未来框架(用Java编写)设计的角度来问。


我发现了一个类似的问题,但最初的提问者实际上想知道为什么它被认为是一个好的做法:方法链接——为什么它是一个好的实践,或者不是一个好的实践? https://stackoverflow.com/questions/1103985/method-chaining-why-is-it-a-good-practice-or-not


虽然有一些可用的答案,但我仍然不确定链接的所有优点和缺点是什么,以及让所有 void 方法可链接是否被认为有用。


缺点

  • 原则上它会混淆签名,如果有东西返回一个新的 例如,我不希望它也是一个 mutator 方法。例如如果 向量有一个缩放方法,那么如果它有一个返回值,我会假设 它返回一个按输入缩放的新向量,如果没有,那么我 期望它能够在内部扩展。
  • 另外,如果类被扩展,当然你会遇到问题,在链接过程中你的对象被强制转换为超类型。当在父类中声明链接方法但在子类的实例上使用链接方法时,就会发生这种情况。

Benefits

  • 它允许数学方程将样式代码编写为完整方程,而不需要多个中间对象(导致不必要的开销),例如,如果没有链接向量三重叉积的方法(作为随机示例),则必须将其编写为

    MyVector3d tripleCrossProduct=(vector1.multiply(vector2)).multiply(vector3);
    

    其缺点是创建必须创建并垃圾收集的中间对象,或者

    MyVector3d tripleCrossProduct=vector1;
    tripleCrossProduct.multiplyLocal(vec2);
    tripleCrossProduct.multiplyLocal(vec3);
    

    这避免了中间对象的创建but非常不清楚,变量名tripleCrossProduct事实上,直到第 3 行为止都是一个谎言。但是,如果您有方法链接,则可以用正常的数学方式简洁地编写它,而无需创建不必要的中间对象。

    MyVector3d tripleCrossProduct=vector1.multiplyLocal(vector2).multiplyLocal(vector3);
    

    所有这些都假设 vector1 是牺牲性的并且永远不需要再次使用

  • 当然还有明显的好处;简洁。即使您的操作没有链接到我上面示例的庄园中,您仍然可以避免对该对象的不必要的引用

    SomeObject someObject=new SomeObject();
    someObject
      .someOperation()
      .someOtherOperation();
    

NB MyVector3d没有被用作真正的 Java 类,但假设在以下情况下执行叉积:.multiply()方法被调用。.cross()不使用,以便那些不熟悉向量微积分的人更清楚“意图”
注意,阿米特的解决方案是使用多行方法链接的第一个答案,为了完整性,我将其作为第四个要点的一部分

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

方法链接的优点和缺点以及用对象本身替换所有 void 返回参数的可能性 的相关文章

随机推荐