Java Fluent数学API约定

Java Fluent数学API约定,java,coding-style,fluent,api-design,calling-convention,Java,Coding Style,Fluent,Api Design,Calling Convention,我目前正在为四元数、矩阵等制作小型数学api。。。我在开发这些方法的时候遇到了一个问题,那就是如何正确地设计这些方法,使其能够流畅地使用 给出这个例子 public class Quaternion { private double q0,q1,q2,q3; public Quaternion slerp(Quaternion other, float amt){ // Some calculations // First option return

我目前正在为四元数、矩阵等制作小型数学api。。。我在开发这些方法的时候遇到了一个问题,那就是如何正确地设计这些方法,使其能够流畅地使用

给出这个例子

public class Quaternion {
  private double q0,q1,q2,q3;

  public Quaternion slerp(Quaternion other, float amt){         
    // Some calculations

    // First option return this and update the object
    return this;    

    // Second option - Create a new Instance
    return new Quaternion(res.getQ0(), res.getQ1(), res.getQ2(), res.getQ3());
  }
。。。返回结果有两种可能。首先是更新的实例或全新的实例

是否有任何惯例如何设计这样的方法,以便与其他功能(多重、旋转、共轭)一起流畅地使用

例如,Java BigDecimal、BigInteger类被设计为返回一个新对象,而不是返回实际实例

另一方面,一些图书馆正在使用返回此方法

从我这边我发现

Quaternion result = start.slerp(other, 0.25f); // return new object
。。。比这更合理

start.slerp(other, 0.25f); // return this
想象一下,使用第二种方法,您希望在下面使用原始[start]对象进行另一次计算。然后需要在slerp方法之前创建一个temp变量


你方对此有什么经验吗?这些方法中的一种(例如,对于immutabel是新的,对于mutable是返回此值)更常用,还是这只是一个决定一种方法而不是在孔API中坚持它的问题?

您希望您的对象是不可变的,比如
bigdecim
,还是希望它们更像构建器模式,像
StringBuilder
,您在其中不断修改对象的状态?两种方式都很流利。我认为两者之间的选择与fluent无关。您是希望对象是不可变的,如
bigdecimic
,还是希望它们更像构建器模式,如
StringBuilder
,在其中不断修改对象的状态?两种方式都很流利。我不相信两者之间的选择与流利无关。