Вызов нескольких методов для одного и того же объекта без каких-либо ссылок - PullRequest
0 голосов
/ 26 декабря 2018

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

поэтому мой вопрос:
как мне разрешить вызов нескольких методов для объекта без ссылки

например,

AlertDialog.Builder(view.context)  
    .setTitle(title)  
    .setMessage(msg)  
    .show()

КАК ЭТО ДЕЛАЕТ

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

Они используют Builder pattern

Вот пример в Java

/**
 * Represents the product created by the builder.
 */
class Car {
    private int wheels;
    private String color;

    public Car() {
    }

    public String getColor() {
        return color;
    }

    public void setColor(final String color) {
        this.color = color;
    }

    public int getWheels() {
        return wheels;
    }

    public void setWheels(final int wheels) {
        this.wheels = wheels;
    }

    @Override
    public String toString() {
        return "Car [wheels = " + wheels + ", color = " + color + "]";
    }
}

/**
 * The builder abstraction.
 */
interface CarBuilder {
    Car build();

    CarBuilder setColor(final String color);

    CarBuilder setWheels(final int wheels);
}

class CarBuilderImpl implements CarBuilder {
    private Car carTmp;

    public CarBuilderImpl() {
        carTmp = new Car();
    }

    @Override
    public Car build() {
        Car car = new Car();
        car.setColor(carTmp.getColor());
        car.setWheels(carTmp.getWheels());
        return car;
    }

    @Override
    public CarBuilder setColor(final String color) {
        carTmp.setColor(color);
        return this;
    }

    @Override
    public CarBuilder setWheels(final int wheels) {
        carTmp.setWheels(wheels);
        return this;
    }
}

public class CarBuildDirector {
    private CarBuilder builder;

    public CarBuildDirector(final CarBuilder builder) {
        this.builder = builder;
    }

    public Car construct() {
        return builder.setWheels(4)
                      .setColor("Red")
                      .build();
    }

    public static void main(final String[] arguments) {
        final CarBuilder builder = new CarBuilderImpl();

        final CarBuildDirector carBuildDirector = new CarBuildDirector(builder);

        System.out.println(carBuildDirector.construct());
    }
}
0 голосов
/ 26 декабря 2018

Поскольку вы также пометили Kotlin, там есть хорошая альтернатива, недоступная в Java.Например, если у вас не было AlertDialog.Builder, а методы типа setTitle(title) были определены только для AlertDialog (и не return this, поэтому они не могут быть связаны), вы могли бы написать

val dialog = AlertDialog(...).apply {
    title = "some title" // calls setTitle
    message = "some message"
}

см., Например, https://medium.com/@elye.project/mastering-kotlin-standard-functions-run-with-let-also-and-apply-9cd334b0ef84 или https://kotlinexpertise.com/coping-with-kotlins-scope-functions/ для обсуждения стандартных функций области действия (apply является лишь одной из них).

0 голосов
/ 26 декабря 2018

Вы должны рассмотреть шаблон проектирования Builder.Пожалуйста, обратитесь к этим очень полезным ссылкам:

https://www.javaworld.com/article/2074938/core-java/too-many-parameters-in-java-methods-part-3-builder-pattern.html

https://medium.com/@ajinkyabadve/builder-design-patterns-in-java-1ffb12648850

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...