所以我在许多地方看到过调用类的方法:
SomeClass obj = new SomeClass();
obj.addX(3).addY(4).setSomething("something").execute();
我认为我完全不明白这是如何运作的。每个方法是否彼此独立,因此上述等于:
obj.addX(3);
obj.addY(4);
obj.addSomething("something");
obj.execute();
或者他们是否以其他方式设计他们的类结构。如果他们是如何设计他们的类来支持这个?
另外,那有特定的名字吗?或者这只是在类上调用方法?
答案 0 :(得分:7)
这将是方法链接。它可以做两件事之一。
每次调用方法都会返回this
,这样您就可以继续调用原始实例上的方法。
public class SomeClass
{
private int _x = 0;
private int _y = 0;
private String _something = "";
public SomeClass addX(int n)
{
_x += n;
return this;
}
public SomeClass addY(int n)
{
_y += n;
return this;
}
public SomeClass setSomething(String something)
{
_something = something;
return this;
}
// And so on, and so on, and so on...
}
每个方法调用都返回一个新的类实例,其中包含适当复制/更新的所有内容。这使得课程不可变(因此你不会意外地修改你并不意味着的东西)。
public class SomeClass
{
private int _x = 0;
private int _y = 0;
private String _something = "";
public SomeClass(int x, int y, String something)
{
_x = x;
_y = y;
_something = something;
}
public SomeClass addX(int n)
{
return new SomeClass(_x + n, _y, _something);
}
public SomeClass addY(int n)
{
return new SomeClass(_x, _y + n, _something);
}
public SomeClass setSomething(String something)
{
return new SomeClass(_x, _y, something);
}
// And so on, and so on, and so on...
}
有些人还提到了Fluent Interfaces。 Fluent Interfaces利用方法链来创建一个API,它提供了一种领域特定语言的东西,可以使代码读取得更清晰。在这种情况下,您的示例并不合格。
答案 1 :(得分:2)
他们修改对象的状态并主要返回相同的对象
class Number{
int num;
public Number add(int number){
num+=number;
return this;
}
}
你可以称之为
new Number().add(1).add(2);
大部分时间用例是返回新的Object以支持不变性
答案 2 :(得分:1)
每个方法都返回一个实例。例如,调用
obj.addX(3)
将返回相同的实例obj
,因此调用
obj.addX(3).addY(4)
将等同于
obj.addY(4)
这称为method chaining。
方法实现如下:
public SomeClass addX(int i) {
// ...
return this; // returns the same instance
}
答案 3 :(得分:0)
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test1 abc = new Test1();
abc.add1(10, 20).sub1(40, 30).mul1(23, 12).div1(12, 4);
}
public Test1 add1(int a, int b)
{
int c = a + b;
System.out.println("Freaking Addition output : "+c);
return this;
}
public Test1 sub1(int a, int b)
{
int c = a - b;
System.out.println("Freaking subtraction output : "+c);
return this;
}
public Test1 mul1(int a, int b)
{
int c = a * b;
System.out.println("Freaking multiplication output : "+c);
return this;
}
public Test1 div1(int a, int b)
{
int c = a / b;
System.out.println("Freaking divison output : "+c);
return this;
}
}