Java连续方法调用

时间:2014-06-24 20:09:25

标签: java methods

所以我在许多地方看到过调用类的方法:

SomeClass obj = new SomeClass();
obj.addX(3).addY(4).setSomething("something").execute();

我认为我完全不明白这是如何运作的。每个方法是否彼此独立,因此上述等于:

obj.addX(3);
obj.addY(4);
obj.addSomething("something");
obj.execute();

或者他们是否以其他方式设计他们的类结构。如果他们是如何设计他们的类来支持这个?

另外,那有特定的名字吗?或者这只是在类上调用方法?

4 个答案:

答案 0 :(得分:7)

这将是方法链接。它可以做两件事之一。

  1. 每次调用方法都会返回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...
    }
    
  2. 每个方法调用都返回一个新的类实例,其中包含适当复制/更新的所有内容。这使得课程不可变(因此你不会意外地修改你并不意味着的东西)。

    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...
    }
    
  3. 有些人还提到了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;
    }
}