【发布时间】:2010-11-23 14:51:53
【问题描述】:
让java中的setter返回“this”是个好主意还是坏主意?
public Employee setName(String name){
this.name = name;
return this;
}
这种模式很有用,因为你可以像这样链接设置器:
list.add(new Employee().setName("Jack Sparrow").setId(1).setFoo("bacon!"));
而不是这个:
Employee e = new Employee();
e.setName("Jack Sparrow");
...and so on...
list.add(e);
...但这有点违反标准约定。我想这可能是值得的,因为它可以让那个 setter 做一些其他有用的事情。我已经看到这种模式在某些地方使用过(例如 JMock、JPA),但它似乎并不常见,并且通常仅用于定义非常明确的 API,而这种模式无处不在。
更新:
我所描述的显然是正确的,但我真正想要的是一些关于这是否普遍可以接受的想法,以及是否存在任何陷阱或相关的最佳实践。我知道 Builder 模式,但它比我所描述的要复杂一些 - 正如 Josh Bloch 所描述的那样,有一个关联的静态 Builder 类用于对象创建。
【问题讨论】:
-
自从我前段时间看到这种设计模式以来,我尽可能地这样做。如果一个方法不需要显式地返回一些东西来完成它的工作,它现在返回
this。有时,我什至会更改函数,以便它对对象的成员进行操作,而不是返回值,这样我就可以做到这一点。太棒了。 :) -
对于返回自我的伸缩式安装器和在构建器中,我更喜欢使用 withName(String name) 而不是 setName(String name)。正如您指出的那样,setter 的常见做法和期望是返回 void。 “非标准”设置器在现有框架中可能表现不佳,例如JPA 实体管理器、Spring 等
-
请在每次调用之前引入换行符 :) 并配置您的 IDE,或者如果它不遵守这一点,请获得一个合适的。
-
广泛使用的框架(例如 Spring 和 Hibernate)将严格(至少他们曾经)遵守 void-setters 约定
标签: java oop design-patterns