目前我只能想到在(公共)方法中返回 this
的三个充分理由,即:
(mmyers)实施流畅的界面时,例如
public class X
{
...
public X enableValidation()
{
setValidation(true);
return this;
}
...
}
(Jon Skeet)身份转换,例如
public class X
{
...
public X toX()
{
return this;
}
...
}
(Dave Ray)在不可变对象上实施 clone()
或copy()
方法,例如
@Immutable
public class X
{
...
public X copy()
{
return this;
}
...
}
在面向对象语言中是否还有其他有用的方案,您可以从方法返回this
或self
?
答案 0 :(得分:4)
如果您正在创建链接操作(但这可能不是非常OOP'ish - Demeter法则等。)
示例(不是很有意义):
public class X
{
public X Add(int i)
{
this.Value += i;
return this;
}
public X Subtract(int i)
{
this.Value -= i;
return this;
}
public int Value
{
get;
set;
}
}
new X().Add(4).Subtract(5).Value;
答案 1 :(得分:2)
String.toString():)
更严重的是,有类似的“转换为[x]”场景,可以只返回“这个”...但我想不出很多其他情况。
答案 2 :(得分:2)
对不可变对象的任何clone()或copy()方法的实现。
答案 3 :(得分:0)
C ++一直这样做以允许级联运算符。
例如<<运算符始终返回自身(ostream),以便您可以以这种方式级联调用:
std::cout << "call 1" << "call2" << std::endl;
我认为这种级联效果很受欢迎的唯一语言是C ++。
答案 4 :(得分:0)
关于流畅的界面快速添加:
正如本文“流畅界面的一个简单例子”文章(评论末尾)所述,:
当使用继承以及流畅的界面时,你会遇到困难,因为:
- 使用多态方法打破了您的调用链和
- 你绝对不希望通过在不需要它们的情况下使用丑陋的铸造和括号,或者在执行铸造的子项中进行大量无用的覆盖来使界面不流畅
在此article about a more robust pattern for complex (and yet fluent) hierarchy of classes中,“this
”用于返回基类“Builder”的实例,而具体类的Builder使用强制转换。
答案 5 :(得分:0)
采取以下实施方式。
public interface Monitorable {
public Statistics getStatistics();
}
public interface MonitorManager {
public Monitorable getMonitorable();
}
class MonitorableService implements Monitorable, MonitorManager {
public Monitorable getMonitorable() {
return this;
}
}
// Meanwhile somwhere else...
MonitorManager manager = getMonitorManagerFromSomewhere();
Monitorable monitorable = manager.getMonitorable();
我承认这是相当做作的,但总体模式/信息应该清楚。
这里我不需要知道MonitorManager是由Application类实现的。我也不需要知道应用程序实现了Monitorable。
这里使用多态来封装Application的实现细节。哪个不是公共课。这是一种非常常见的模式,可以在各种各样的项目中看到。