【问题标题】:How to make code dynamic for similar kind of blocks如何使类似块的代码动态化
【发布时间】:2021-06-20 19:01:32
【问题描述】:

我正在使用 vaadin 创建我的网页,我需要为不同类型创建相同类型的块,例如需要显示具有汽车详细信息的块,因此只有汽车名称会不同,但块设计将与相同的标签相同但不同的标签。我想编写通用代码,以便我可以将其扩展为任何汽车名称,而无需手动添加。

附上我正在使用的代码 sn-p,我正在为不同类型重复我的代码。想要动态实现。

    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());
            });
        }

【问题讨论】:

  • 我不太确定这与 Vaadin 有什么关系。我们可以假设,您已经尝试编写一个结合公共代码并被参数化以接受差异的函数,但它以某种方式失败了?请添加您尝试过的代码以及失败的原因(例如错误、堆栈跟踪、日志等),以便我们对其进行改进。

标签: java java-8 vaadin vaadin8


【解决方案1】:

您可以通过识别您不想保持静态的所有部分并将这些部分移动到由方法参数填充来将方法更改为更通用。 IE。而不是

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 以及任何类型的集合 selectedGapFillingCountWINTSselectedGapFillingCountFR 碰巧是,并且该方法可能应该返回网格而不是直接将其设置为一个类变量。

【讨论】:

  • 感谢您的回答,但我不想为多个数据源设置多个类变量。我想以一种非常通用的方式编写,以便我可以添加任何数据源而无需在类中进行太多更改。
  • 如果你不想,你不必有任何类变量,你只需要将它们作为方法参数传递。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多