Добавить для LookupBuildrer метод withLoadDelegate

Есть ли возможность добавить для LookupBuildrer метод withLoadDelegate?
Т.е. использование может выглядеть так:

screenBuilders.lookup(Entity.class, this)
                .withScreenClass(EntityBrowse.class)
                .withOpenMode(OpenMode.DIALOG)
                .withLoadDelegate(loadContext -> getEntities())
                .show();

Кажется это нарушает абстракцию окна, которое так открывается, и я бы не советовал так делать.

А вообще, прямо сейчас мы можете объявить у своего окна метод и вызвать его перед показом:

class MyScreen extends StandardLookup<User> {
    public void setLoadDelegate(Supplier<List<User>> supplier) {
    }
}

И вызвать окно:

MyScreen myScreen = screenBuilders.lookup(Entity.class, this)
                .withScreenClass(MyScreen.class)
                .withOpenMode(OpenMode.DIALOG)
                .build();
myScreen.setLoadDelegate(loadContext -> getEntities());
myScreen.show();

Примерно так сейчас и делаю… Хотелось получить штатный метод.

Тут, видимо, не совсем понимаю проблематику, но положусь на ваше мнение.

Добавлю. Может кому-то пригодится. В итоге сделал как-то так:

public class MyBrowseOptions implements ScreenOptions {

    private Function<LoadContext<User>, List<User>> loadDelegate;

    public Function<LoadContext<User>, List<User>> getLoadDelegate() {
        return loadDelegate;
    }

    public void setLoadDelegate(Function<LoadContext<User>, List<User>> loadDelegate) {
        this.loadDelegate = loadDelegate;
    }
    
    public MyBrowseOptions withLoadDelegate(final Function<LoadContext<User>, List<User>> loadDelegate) {
        setLoadDelegate(loadDelegate);
        return this;
    }
}

Передаю в экран так:

screenBuilders.lookup(User.class, this)
                    .withOpenMode(OpenMode.DIALOG)
                    .withOptions(new MyBrowseOptions()
                            .withLoadDelegate(loadContext -> getUsers())
                    .show();

Соответственно в экране обрабатываю.

Юрий, как вы считаете, не будет ли лучше, если билдер будет принимать не один класс реализующий ScreenOptions, а коллекцию? Сейчас получается, что для каждого экрана фактически нужно создавать свой класс опций. В случае же использовании коллекции можно будет фактически использовать ScreenOptions с одной единственной опцией (поделить функционально) и комбинировать их для разных экранов.

Эти самые коллекции ещё и создавать нужно будет всегда и тратить на это CPU и память. Там специально используется один интерфейс, чтобы минимизировать влияние на экраны, в которых нужен всего один объект опций.

Инкапсуляция конечно нарушается, но с другой стороны это достаточно частый use case, так что возможно стоит ввести такой метод withLoadDelegate в стандартный API.

Создал тикет. Голосуйте за идею, нам надо понять потребность.

2 симпатии