Java中的setter约定(返回void或this)

kpi*_*pie 14 java setter coding-style

我已经写了近一年的Java了,我已经看到了两种不同的约定,用于人们如何实现他们的setter.

为了说明这一点,以下是两种惯例的示例.(我也很想知道这两个模式的简洁名称)

使用第一个约定的类,不返回其"set"方法.像这样:

public class Classic{
    private double _x;
    private double _y;
    public Classic(){
        x = 0;
        y = 0;
    }
    public void setX(double d){//or boolean with a type check on input
        x = d;
    }
    public void sety(double d){
        y = d;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用替代约定的类从其setter方法返回.像这样:

public class Alternative{
    private double _x;
    private double _y;
    public Alternative(){
        x = 0;
        y = 0;
    }
    public Alternative setX(double d){
        x = d;
        return(this);
    }
    public Alternative sety(double d){
        y = d;
        return(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

不同之处在于使用替代方法语法,例如

Alternative NewAlt(double x,double y){
     return(new Alternative()
                .setX(x)
                .setY(y));
}
Run Code Online (Sandbox Code Playgroud)

可以使用经典设置,同样的工厂方法看起来像这样.

Classic NewAlt(double x,double y){
     Classic temp = new Classic();
     temp.setX(x);
     temp.setY(x);
     return(temp);
}
Run Code Online (Sandbox Code Playgroud)

有争议的是哪些更具可读性/可用性.

我的问题是关于这两种模式之间的性能差异.它存在吗?如果是这样,差异有多大,它来自何处?

如果没有性能差异,哪一个被认为是"更好的做法"?

asy*_*ync 18

方法链接在某些情况下看起来不错,但我不会过度使用它.它确实在构建器模式中得到了很多使用,如另一条评论中所述.在某种程度上,这可能是个人偏好的问题.

在我看来,方法链的一个缺点是调试和断点.单步执行填充链式方法的代码可能很棘手 - 但这也可能取决于IDE.我发现调试的能力绝对至关重要,因此我通常会避免在调试时使我的生活变得更难的模式和片段.

  • 用于编写易于调试的代码的+1,但如果你必须在setter上设置断点,那么你已经遇到麻烦了;-) (7认同)
  • 返回一些东西会携带一条指令(或一些额外的指令),而不是返回任何东西,所以`return this`稍微慢一点 - 如果你可以这样调用它.JVM规范详细介绍了它的工作原理.不幸的是我不记得非常准确,所以请带上一点盐. (3认同)