ciao!

vorrei migliorare un pò questo codice.
partiamo dal FileChooser:
codice:
public class DirChooser {

    private File lastDir;

    public DirChooser() {
        lastDir = new File(System.getProperty("user.home"));
    }

    public Optional<String> saveFile(Window ownerWindow, String title, FileChooser.ExtensionFilter ext) {
        FileChooser chooser = new FileChooser();
        chooser.setTitle(title);
        chooser.setInitialDirectory(lastDir);
        chooser.getExtensionFilters().add(ext);
        File file = chooser.showSaveDialog(ownerWindow);
        if (file != null) {
            return Optional.of(file.getPath());
        } else {
            return Optional.empty();
        }
    }

}

poi nel mio controller ho vari MenuItem per vari tipi di esportazione dati (json,xls,xlm,csv).
tutti richiamano lo stesso metodo, che fa una sorta di "dispatch".
a seconda dell'item selezionato, richiama il chooser e poi la classe preposta all'export:
codice:
@FXML
private MenuItem miCsv;

@FXML
private MenuItem miXls;

@FXML
private MenuItem miXml;

@FXML
private void esporta(ActionEvent ev) {
    Object obj = ev.getSource();

    List<Nota> list = null;
    try {
        list = db.getAll();
    } catch (SQLException ex) {
        GenericDialog.showDialog("Errore database: " + ex.getMessage(), Alert.AlertType.WARNING);
    }

    if (list != null) {
        DirChooser dc = new DirChooser();
        Optional<String> f;

        if (obj == miJson) {
            f = dc.saveFile(getStage().getOwner(), "Esporta JSON", new FileChooser.ExtensionFilter("JSON (*.json)", "*.json"));
            if (f.isPresent()) {
                try {
                    JsonDb jd = new JsonDb();
                    jd.create(f.get(), list);
                    GenericDialog.showDialog("Database esportato!", Alert.AlertType.INFORMATION);
                } catch (IOException ex) {
                    GenericDialog.showDialog(ex.getMessage(), Alert.AlertType.WARNING);
                }
            }
        } else if (obj == miXls) {
            f = dc.saveFile(getStage().getOwner(), "Esporta XLS", new FileChooser.ExtensionFilter("XLS (*.xls)", "*.xls"));
            if (f.isPresent()) {
                try {
                    ExcelDb ed = new ExcelDb();
                    ed.create(f.get(), tblCaption, list);
                    GenericDialog.showDialog("Database esportato!", Alert.AlertType.INFORMATION);
                } catch (IOException | WriteException ex) {
                    GenericDialog.showDialog(ex.getMessage(), Alert.AlertType.WARNING);
                }
            }
        } else if (obj == miCsv) {
            f = dc.saveFile(getStage().getOwner(), "Esporta CSV", new FileChooser.ExtensionFilter("CSV (*.csv)", "*.csv"));
            if (f.isPresent()) {
                try {
                    CsvDb cd = new CsvDb();
                    cd.create(f.get(), tblCaption, list);
                    GenericDialog.showDialog("Database esportato!", Alert.AlertType.INFORMATION);
                } catch (IOException ex) {
                    GenericDialog.showDialog(ex.getMessage(), Alert.AlertType.WARNING);
                }
            }
        } else if (obj == miXml) {
            f = dc.saveFile(getStage().getOwner(), "Esporta XML", new FileChooser.ExtensionFilter("XML (*.XML)", "*.XML"));
            if (f.isPresent()) {
                try {
                    XmlDb xd = new XmlDb();
                    xd.create(f.get(), list);
                    GenericDialog.showDialog("Database esportato!", Alert.AlertType.INFORMATION);
                } catch (ParserConfigurationException | TransformerException ex) {
                    GenericDialog.showDialog(ex.getMessage(), Alert.AlertType.WARNING);
                }
            }
        }
    }
}
in pratica, recupero la lista da database, e poi controllo quale item è stato cliccato.
in base a quello imposto i parametri del chooser, e richiamo la classe per l'export.
ma tutti questi if/else non mi piacciono.
secondo voi dove posso intervenire??