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

2022-09-03 13:40:49

我已经写了将近一年的Java,我已经看到了2种不同的约定,人们如何实现他们的设置器。

为了说明这一点,下面是这两个约定的示例。(我也想知道这两个模式的简明名称)

使用第一约定的类,不从其“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;
    }
}

使用替代约定的类从其 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);
    }
}

区别在于,使用替代方法语法,例如

Alternative NewAlt(double x,double y){
     return(new Alternative()
                .setX(x)
                .setY(y));
}

这是可能的,而使用经典的设置,相同的工厂方法将看起来像这样。

Classic NewAlt(double x,double y){
     Classic temp = new Classic();
     temp.setX(x);
     temp.setY(x);
     return(temp);
}

其中哪一个更具可读性/可用性是有争议的。

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

如果没有性能差异,哪一个被认为是“更好的实践”?


答案 1

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

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


答案 2

你在课堂上使用的变体是我从“生成器模式”中知道的。在那里,任务是构建一些类似于 的特定对象。Alternativebuilder.setX().setY().build()

就个人而言,每当变体没有特定用途时,我都会使用变体。ClassicAlternative

(作为旁注,我不会使用括号return)