0

私は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. インスタンスで新しいタブを作成します。

データ アクセス インターフェイスが異なる POJO を使用する場合、何らかの方法でこれをテンプレート化できますか? Generic インターフェイスを作成して使用することはできますか? 思考の正しい方向性を教えてもらえますか?

時間を無駄にしていただきありがとうございます。

4

1 に答える 1

1

Java にはテンプレートがないため、いずれにしてもコードの重複が発生します。ただし、 factoryを使用すると定型コードの一部を削減できます。例えば:

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 を作成する必要はありません。

パネルや、このパターンが適合する他のオブジェクトについても同様です。

于 2013-06-27T09:28:56.767 に答える