Как выполнить цепочку методов в Java? o.m1(). м2(). м3(). m4()
Я видел во многих обозначениях кода Java, что после метода, который мы называем другим, вот пример.
Toast.makeText(text).setGravity(Gravity.TOP, 0, 0).setView(layout).show();
Как вы видите после вызова makeText
по возврату, мы вызываем setGravity
и пока
Как я могу сделать это с помощью своих собственных классов? Должен ли я делать что-то особенное?
Ответы
Ответ 1
Этот шаблон называется "Свободные интерфейсы" (см. Wikipedia)
Просто return this;
из методов вместо того, чтобы ничего не возвращать.
Итак, например
public void makeText(String text) {
this.text = text;
}
станет
public Toast makeText(String text) {
this.text = text;
return this;
}
Ответ 2
class PersonMethodChaining {
private String name;
private int age;
// In addition to having the side-effect of setting the attributes in question,
// the setters return "this" (the current Person object) to allow for further chained method calls.
public PersonMethodChaining setName(String name) {
this.name = name;
return this;
}
public PersonMethodChaining setAge(int age) {
this.age = age;
return this;
}
public void introduce() {
System.out.println("Hello, my name is " + name + " and I am " + age + " years old.");
}
// Usage:
public static void main(String[] args) {
PersonMethodChaining person = new PersonMethodChaining();
// Output: Hello, my name is Peter and I am 21 years old.
person.setName("Peter").setAge(21).introduce();
}
}
Без привязки метода
class Person {
private String name;
private int age;
// Per normal Java style, the setters return void.
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void introduce() {
System.out.println("Hello, my name is " + name + " and I am " + age + " years old.");
}
// Usage:
public static void main(String[] args) {
Person person = new Person();
// Not using chaining; longer than the chained version above.
// Output: Hello, my name is Peter and I am 21 years old.
person.setName("Peter");
person.setAge(21);
person.introduce();
}
}
Цепочка метода, также известная как именованный параметр idiom, является распространенным синтаксисом для вызова нескольких вызовов методов в объектно-ориентированных языках программирования. Каждый метод возвращает объект, позволяющий связать цепочку вместе в одном выражении. Цепочки - это синтаксический сахар, который устраняет необходимость в промежуточных переменных. Цепочка метода также известна как крушение поезда из-за увеличения числа методов, которые происходят один за другим в той же самой строке, что и в случае, когда большее количество методов соединены друг с другом, даже если разрывы строк часто добавляются между методами.
Подобным синтаксисом является метод каскадирования, где после вызова метода выражение оценивается текущим объектом, а не возвращаемым значением метода. Каскадирование может быть реализовано с помощью цепочки методов, поскольку метод возвращает текущий объект (это). Каскадирование - ключевой метод на плавных интерфейсах, и поскольку цепочка широко реализуется в объектно-ориентированных языках, а каскадирование - нет, эта форма "каскадирования по цепочке путем ее возвращения" часто упоминается просто как "цепочка". Как цепочка, так и каскадирование исходят из языка Smalltalk.
Ответ 3
В вашем примере:
Toast.makeText(текст).setGravity(Gravity.TOP, 0, 0).setView(макет).show();
Каждый метод в цепочке должен возвращать класс или интерфейс. Следующий метод в цепочке должен быть частью возвращаемого класса.
Начнем с Тоста. Метод makeText, который определяется как статический метод в классе Toast, должен возвращать класс или интерфейс. Здесь он возвращает экземпляр класса Gravity.
Метод setGravity, который определен в классе Gravity, возвращает экземпляр класса View,
Метод setView, который определен в представлении класса, возвращает экземпляр класса JPanel.
Эта цепочка может быть выписана шаг за шагом.
Gravity gravity = Toast.makeText(text);
View view = gravity.setGravity(Gravity.TOP, 0, 0);
JPanel panel = view.setView(layout);
panel.show();
Написание цепочки в виде цепочки удаляет все промежуточные переменные экземпляра из исходного кода.
Ответ 4
Найдите шаблон разработчика или свободный интерфейс в Google, чтобы получить более подробную информацию об этом.
Возврат 'this' в конце вашего метода может сделать трюк в большинстве случаев.
Ответ 5
Добавление return this; наверняка поможет в цепочке для этого класса, но не для подклассов.
Если вы хотите, чтобы поведение цепочки, унаследованное подклассами, также изменило вашу подпись класса, как показано ниже:
Класс SuperClass < SubClass расширяет SuperClass > {}
Таким образом, все подклассы наследуют цепочку методов.
Пример:
public class SuperClass<SubClass extends SuperClass> {
public SubClass testMethod(){
return (SubClass)this;
}
public static void main(String[] args) {
SuperClass<SuperClass> superClass = new SuperClass<SuperClass>();
superClass.testMethod().testMethod().testMethod();
System.out.println(superClass.toString());
}
}
Ответ 6
или вы можете использовать Diezel, который генерирует все необходимые вам интерфейсы на основе регулярного выражения вашего свободного API.