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

时间:2015-04-25 18:22:36

标签: java setter coding-style

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

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

使用第一个约定的类,不会从他们的'中返回任何内容。方法。像这样:

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);
}

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

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

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

3 个答案:

答案 0 :(得分:18)

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

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

答案 1 :(得分:3)

您在课程DISTINCT中使用的变体是我从“构建器模式”中了解到的。在那里,任务是构建一些类似于Alternative的特定对象。

就个人而言,只要builder.setX().setY().build()变种没有特定用途,我就会使用Classic变体。

(作为旁注,我不会在Alternative

中使用括号

答案 2 :(得分:0)

Java中的setter通常与JavaBeans的概念相关联,即使我们现在使用这个概念而不是那样调用它,但它实际上经常使用而没有被明确地命名,有时人们称它们为实体(即使没有ORM上下文)。

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

除了他们应该尽可能简单之外,没有什么可说的。在这方面,setter的最简单实现是void:只需设置值并退出。

如果你看一下IDE的作用,那么setter的默认实现就是void

在这方面,我总是以void方式获取价值对象(他们称之为JavaBeans,Entity,Dto等)并且从不使用链接方式。您询问最佳实践,void - 方式是价值对象的最佳实践。

对于工具,例如构建器,dsl,服务,流,我可能只使用链接,只要它真的有意义且添加了一些内容并且不会太麻烦。

我的简短建议是使用void作为价值对象,并为剩下的事情做任何你想做的事情。设计课程很有趣。 ;)