有可能 - 模拟这种方法吗?

时间:2013-06-27 08:44:45

标签: java swing templates generics

我是Java新手,对于更高级的开发人员我有一些问题。

我有基于Swing的GUI应用程序,其中有几个AbstractActions。 一大组AbstractActions根据JPanel创建新标签。例如:

// opens "Documents" tab
documentsAction = new AbstractAction(DOCUMENTS) {
  @Override
  public void actionPerformed(ActionEvent e) {
    try {
      int index = getTabIndex(DOCUMENTS);
      if (index >= 0) {
        // Tab exists, just open it.
        tabbedPane.setSelectedIndex(index);
      } else {
        // No tab. Create it and open
        newCatalogTab(new DocumentService(), DOCUMENTS);
      }
    } catch (ServiceException ex) {
      printError(ex.getMessage());
    }
  }
};
documentsItem.setAction(documentsAction);

getTabIndex的位置:

  private int getTabIndex(String tabName) {
    int result = -1;
    for (int i = 0; i < tabbedPane.getTabCount(); i++) {
      if (tabName.equals(tabbedPane.getTitleAt(i))) {
        result = i;
        break;
      }
    }
    return result;
  }

newCatalogTab是:

  private void newCatalogTab(ICatalog service, String Name) throws ServiceException {
    CatalogPanel panel = new CatalogPanel(service);
    tabbedPane.add(Name, panel);
    tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
    checkTabs(); // changes activity of buttons like "edit" and "delete"
  }

因此,许多AbstractAction做了类似的工作:

  1. 创建类的实例,扩展AbstractPanel;
  2. 将数据访问接口(示例中为DocumentService)传递给实例;
  3. 使用实例创建新标签。
  4. 如果数据访问接口使用不同的POJO,我可以以某种方式模板化吗? 我可以创建Generic界面并使用它吗? 你能告诉我正确的思考方向吗?

    感谢您浪费时间。

1 个答案:

答案 0 :(得分:1)

Java中没有模板,因此在任何情况下都会有一些代码重复。但是,您可以使用factories来删除一些样板代码。例如:

interface CatalogFactory {
    public ICatalog makeCatalog();
}

class DocumentServiceFactory implements CatalogFactory {
    @Override
    public ICatalog makeCatalog() {
        return new DocumentService();
    }
}

class TabAction extends AbstractAction {
    private final String name;
    private final CatalogFactory factory;

    //Appropriate constructor...

    @Override
    public void actionPerformed(ActionEvent e) {
        //...
        newCatalogTab(factory.makeCatalog(), name);
        //...
    }
}

然后你可以做

documentsItem.setAction(new TabAction(DOCUMENTS, new DocumentServiceFactory()));

无需为每个标签创建单独的匿名AbstractAction。

同样适用于面板以及此图案适合的其他对象。