Как сделать код динамичным для подобных блоков

#java #java-8 #vaadin #vaadin8

Вопрос:

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

Прикрепляю фрагмент кода, который я использую, где я повторяю свой код для другого типа. Хотите реализовать его динамически.

     private Grid<PresentableGenerateInputHeaders> winTSHeaderColumnsGrid;
    private Grid<PresentableGenerateInputHeaders> fRHeaderColumnsGrid;
    private ListDataProvider<PresentableGenerateInputHeaders> listDataProvider;
    private List<PresentableGenerateInputHeaders> presentableGenerateInputHeaders = new ArrayList<>();

private void initWinTsGrid() {
    
            listDataProvider = new ListDataProvider<>(presentableGenerateInputHeaders);
            winTSHeaderColumnsGrid = new Grid<PresentableGenerateInputHeaders>(PresentableGenerateInputHeaders.class);
            winTSHeaderColumnsGrid.setDataProvider(listDataProvider);
            winTSHeaderColumnsGrid.setCaption(i18n.get("view.ruleDetails.general.csvHeaderColumns"));
            winTSHeaderColumnsGrid.setStyleName("a-units");
            winTSHeaderColumnsGrid.setWidth("450px");
            winTSHeaderColumnsGrid.setItems(addGridValues(DataSource.WIN_TS, winTSHeaderColumnsGrid));
            winTSHeaderColumnsGrid.getEditor().setEnabled(true);
            winTSHeaderColumnsGrid.setColumnOrder("header", "count");
            winTSHeaderColumnsGrid.sort("header");
            winTSHeaderColumnsGrid.getEditor().addSaveListener((EditorSaveEvent<PresentableGenerateInputHeaders> event) -> {
                event.getGrid().select(event.getBean());
                selectedGapFillingCountWINTS.add(event.getBean());
            });
        }
    
        private void initFRGrid() {
    
            listDataProvider = new ListDataProvider<>(presentableGenerateInputHeaders);
            fRHeaderColumnsGrid = new Grid<PresentableGenerateInputHeaders>(PresentableGenerateInputHeaders.class);
            fRHeaderColumnsGrid.setDataProvider(listDataProvider);
            fRHeaderColumnsGrid.setCaption(i18n.get("view.ruleDetails.general.csvHeaderColumns"));
            fRHeaderColumnsGrid.setStyleName("a-units");
            fRHeaderColumnsGrid.setWidth("450px");
            fRHeaderColumnsGrid.setItems(addGridValues(DataSource.FR, fRHeaderColumnsGrid));
            fRHeaderColumnsGrid.getEditor().setEnabled(true);
            fRHeaderColumnsGrid.setColumnOrder("header", "count");
            fRHeaderColumnsGrid.sort("header");
            fRHeaderColumnsGrid.getEditor().addSaveListener((EditorSaveEvent<PresentableGenerateInputHeaders> event) -> {
                event.getGrid().select(event.getBean());
                selectedGapFillingCountFR.add(event.getBean());
            });
        }
 

Комментарии:

1. Я не совсем уверен, как это связано с Ваадином. Можем ли мы предположить, что вы пытались написать функцию, которая сочетает в себе общий код и параметризована, чтобы принимать различия, и она каким-то образом потерпела неудачу? Пожалуйста, добавьте код, который вы пробовали, и то, как он не удался (например, ошибки, трассировки стеков, журналы…), чтобы мы могли его улучшить.

Ответ №1:

Вы можете изменить методы, чтобы они были более универсальными, определив все части, которые вы не хотите сохранять статичными, и переместив их для заполнения параметрами метода вместо этого. Т. е. вместо

 private void myMethod() {
   grid.setCaption("myCaption");
}
 

вы бы написали

 private void myMethod(String caption) {
   grid.setCaption(caption);
}
 

а потом назови это

 myMethod("myCaption");
 

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

 public MyClass(String gridCaption) {
   myMethod(gridCaption);
}
 

Если вам необходимо динамически задать множество значений, вы можете рассмотреть возможность использования объекта, содержащего все необходимые значения.

 public void myMethod(MyPojo pojo) {
    grid.setCaption(pojo.getGridCaption());
}
 

В вашем примере это выглядит так, как будто общие значения, которые вы хотите передать, являются DataSource dataSource и каким бы типом коллекции selectedGapFillingCountWINTS они selectedGapFillingCountFR ни были, и метод, вероятно, должен возвращать сетку, а не устанавливать ее непосредственно в переменную класса.

Комментарии:

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

2. Вам не обязательно иметь какие-либо переменные класса, если вы этого не хотите, вам просто нужно передать их в качестве параметров метода.