Java连续方法调用

lil*_*tt8 0 java methods

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

SomeClass obj = new SomeClass();
obj.addX(3).addY(4).setSomething("something").execute();
Run Code Online (Sandbox Code Playgroud)

我不认为我完全理解它是如何工作的.每个方法是否彼此独立,因此以上等于:

obj.addX(3);
obj.addY(4);
obj.addSomething("something");
obj.execute();
Run Code Online (Sandbox Code Playgroud)

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

此外,它有一个特定的名称?或者这只是在类上调用方法?

Jus*_*ner 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...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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...
    }
    
    Run Code Online (Sandbox Code Playgroud)

有些人还提到了Fluent Interfaces.Fluent Interfaces利用方法链来创建一个API,它提供了一种领域特定语言的东西,可以使代码读取得更清晰.在这种情况下,您的示例不太合格.