Class Player {
Player setName(String name){
this.name = name;
return this;
// or
void setName(String name){
this.name = name;
}}
您好。如果我使用“void”或“return this”语句使用该方法有什么区别?为什么“返回此”语句存在,如果它也一样?
答案 0 :(得分:5)
为什么“返回此”语句存在,如果它也一样?
他们不会远程做同样的事情。
void方法没有返回值。这意味着您无法使用返回值(例如,您无法将其分配给变量)。
具有返回值的方法具有返回值。在您提到的特定情况下,return this
,它返回对该方法被调用的对象的引用,因此您可以(可能)使用该引用 - 通过调用另一个方法将其赋值给变量这对于 fluent interfaces (允许你进行大量链接的那些)非常有用:
theObject.doThis().thenDoThat().thenDoSomethingElse();
如果是void
,你必须这样写:
theObject.doThis();
theObject.thenDoThat();
theObject.thenDoSomethingElse();
这个 1 最着名的例子可能是Builder pattern对象构造,因为这意味着你不需要变量:
Thingy t = new ThingyBuilder()
.withFoo("foo")
.withBar("bar")
.withBaz("baz")
.build();
1 最着名的外部网络开发圈,即; 在内部开发圈子中,最着名的例子是jQuery的API:$("div").css("color", "green").text("Good");
答案 1 :(得分:3)
第一个用于链接方法(构建器模式),第二个用于普通的vanilla setter方法
答案 2 :(得分:3)
当您<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
<tr id="abc" data-dtoggle="collapse" data-dheader="true" data-dparent="tblXyz" class="expanded">
<td>Hello</td>
</tr>
</table>
时,您将返回return this
个实例。
在Builder Pattern中更常用,它返回名为Joe的Player。
Player
使用Player p = new Player().setName("Bob").setName("Joe");
方法,您无法执行第二个void
。要重命名播放器,您必须获取播放器对象的第一个实例,然后在以下行再次调用setName
。
显然,这是一个简单的例子,但是当你有很多像这样的设置者时更有用
setName
尽管如此,我认为惯例是在这里使用new Player()
.setName("Bob")
.setAge(42)
.setGender("male")
而不是withX
。
答案 3 :(得分:0)
返回this
允许链接,例如:
player.setName(...).setSomethingElse(...)
返回void
时,没有对象引用,因此无法进行链接,并且您的代码如下:
player.setName(...);
player.setSomethingElse(...);
答案 4 :(得分:0)
我想知道为什么人们可以问如何不返回任何东西并且返回的东西可能是相同的。无论如何:不,返回一些东西并且什么都不返回。
返回这个主要用于允许“流畅”的接口,以便您的类的用户可以写
[('', 'pandas', ''), ('', 'os', ''), ('', 'sys', '')]
而不是
yourObject.setFoo(foo).setBar(bar).doSomething();
如果这有助于提高可读性,可能取决于您和使用该源代码的其他人习惯的样式。一种严重依赖于编写此类代码的典型模式是Builder pattern。