Подтвердить что ты не робот

Как выполнить цепочку методов в Java? o.m1(). м2(). м3(). m4()

Я видел во многих обозначениях кода Java, что после метода, который мы называем другим, вот пример.

Toast.makeText(text).setGravity(Gravity.TOP, 0, 0).setView(layout).show();

Как вы видите после вызова makeText по возврату, мы вызываем setGravity и пока

Как я могу сделать это с помощью своих собственных классов? Должен ли я делать что-то особенное?

4b9b3361

Ответ 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.