
Originariamente inviata da
fermat
- alcuni accettano anche uno String[]
- alcuni hanno delle eccezioni "in più" rispetto ad altri
Ok, chiarissimo ora. Il punto però è: le 4 classi possono anche non avere nulla in comune. Ma la functional interface che ho ipotizzato io serve proprio per "appiattire" le differenze tra i vari comportamenti. E il problema resta quello delle eccezioni. Sono ben diverse tra i vari create e questo influisce anche sulla functional interface, perché quelle eccezioni VANNO dichiarate (checked).
Una soluzione è mettere nella f.i. una eccezione più "ampia", es. Exception, sebbene non sia proprio il massimo:
codice:
@FunctionalInterface
public interface DoExport {
void export(File file, List<Nota> list, String[] header) throws Exception;
}
Questo sarebbe ok, prendiamo per buono questo.
Quindi tra i vari export ci sarebbe di differente:
- il titolo (è un dato passabile)
- il filter (è un oggetto passabile)
- il "comportamento" specifico che usa una delle 4 classi.
Inizia con il fare nella tua classe dei metodi per ciascuna delle esportazioni, es.:
codice:
private void esportaNoteInJson(File file, List<Nota> list, String[] header) throws Exception {
JsonDb jd = new JsonDb();
jd.create(file.getAbsolutePath(), list);
}
Nota come la "forma" di questo metodo corrisponde a quella della f.i. (non conta il nome per le f.i.)
Poi fai il metodo che riceve quei parametri che configurano la esportazione:
codice:
private DirChooser dc = new DirChooser(); // così rimane l'ultima directory scelta
public void eseguiEsporta(List<Nota> list, String[] header, String titolo, FileChooser.ExtensionFilter filter, DoExport doExport) {
Optional<File> f = dc.saveFile(getStage().getOwner(), titolo, filter);
if (f.isPresent()) {
try {
doExport.export(f.get(), list, header);
GenericDialog.showDialog("Database esportato!", Alert.AlertType.INFORMATION);
} catch (Exception ex) {
GenericDialog.showDialog(ex.getMessage(), Alert.AlertType.WARNING);
}
}
}
Poi nel esporta fai (abbozzato qui):
codice:
@FXML
private void esporta(ActionEvent ev) {
// .....
List<Nota> list = ......
if (obj == miJson) {
eseguiEsporta(list, tblCaption, "Esporta JSON",
new FileChooser.ExtensionFilter("JSON (*.json)", "*.json"),
this::esportaNoteInJson);
}
// ....
// .....
}
Nota come al eseguiEsporta passo un method reference al esportaNoteInJson, che ha la forma del export di DoExport (la functional interface).
P.S. spero di non aver scritto errori, non ho visione completa sul tuo codice e ovviamente non posso "provare" nulla.