#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. Вам не обязательно иметь какие-либо переменные класса, если вы этого не хотите, вам просто нужно передать их в качестве параметров метода.