gooamoko
gooamoko

Reputation: 658

Is it possible - to template this method?

I am new in Java and i have a few questions for more advanced developers.

I have Swing-based GUI application in which I have several AbstractActions. A large group of AbstractActions creates new tab based on JPanel. For example:

// 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);

Where getTabIndex is:

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

and newCatalogTab is:

  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"
  }

So, many AbstractAction do the similar work:

  1. Create instance of class, that extends AbstractPanel;
  2. Pass data access interface (DocumentService in example) to instance;
  3. Create a new tab with instance.

Can I somehow template this if data access interfaces will use different POJO's? Can I create Generic interface and use it? Can you show me right direction for thinking?

Thanks for wasting your time.

Upvotes: 0

Views: 69

Answers (1)

ntoskrnl
ntoskrnl

Reputation: 5744

There are no templates in Java, so there will be some code duplication in any case. However, you can cut some of the boilerplate code by using factories. For example:

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);
        //...
    }
}

Then you can do

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

without having to create a separate anonymous AbstractAction for each tab.

Similarly for panels and possibly other objects where this pattern fits.

Upvotes: 1

Related Questions