我是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
做了类似的工作:
AbstractPanel
; DocumentService
)传递给实例; 如果数据访问接口使用不同的POJO,我可以以某种方式模板化吗? 我可以创建Generic界面并使用它吗? 你能告诉我正确的思考方向吗?
感谢您浪费时间。
答案 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。
同样适用于面板以及此图案适合的其他对象。