Setter Java 中的约定(return void 或 this)

Setter conventions in Java (return void or this)

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

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

类 使用第一个约定,return 他们的 '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;
    }
}

类 使用替代约定 return 他们自己从他们的 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);
}

有争议的是哪一个更多readable/usable。

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

如果没有性能差异,哪一个被认为是'better practice'?

您在 class Alternative 中使用的变体是我从 'Builder pattern' 中了解到的。在那里,任务是构建一些类似于 builder.setX().setY().build().

的特定对象

就个人而言,只要 Alternative 变体没有特定用途,我就会使用 Classic 变体。

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

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

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

Java中的一个setter最常与JavaBeans的概念联系在一起,尽管我们现在使用这个概念而不是那样称呼它,但它确实经常被使用没有像那样明确命名,有时人们称它们为实体(即使没有 ORM 上下文)。

A JavaBean 具有属性,这些属性是 combination of a private field and (a setter and/or a getter).

那些setters和getter没什么可说的,只是它们应该尽可能简单。在这方面,setter 最简单的实现是 void:只需设置值并退出。

如果您查看 IDE 的作用,setter 的默认实现是 void

在这方面,对于值对象(无论它们被称为 JavaBeans、Entity、Dto 等),我总是会采用 void 方式并且从不使用链接-方法。您询问最佳实践,void 方式是值对象的最佳实践。

对于工具,如构建器、dsl、服务、流,我可能仅在它确实有意义并添加一些东西并且不太麻烦时才使用链接。

我的简短建议是对值对象使用 void,其余的随心所欲。享受设计 类 的乐趣。 ;)