Qual è il modo più pulito per ottenere progressi da una classe che sarà utilizzata anche in un ambiente senza gui allo scopo di visualizzare detto stato in un Gui JavaFX?
Esempio:
import java.util.ArrayList;
import java.util.List;
public class ExampleFetcher {
public List<Entity> fetch() {
final List<Entity> results = new ArrayList<>();
for (int i = 0; i < N; i++) {
final Entity current = //Do some heavy work
results.add(current);
}
return results;
}
}
Ci sono diverse possibilità, ma per me ognuna ha alcuni inconvenienti
1. "Il modo JavaFX": utilizza una proprietà osservabile da javafx.beans
import javafx.beans.property.ReadOnlyDoubleProperty;
import javafx.beans.property.ReadOnlyDoubleWrapper;
import java.util.ArrayList;
import java.util.List;
public class ExampleFetcher {
private final ReadOnlyDoubleWrapper progress = new ReadOnlyDoubleWrapper();
public List<Entity> fetch() {
final List<Entity> results = new ArrayList<>();
for (int i = 0; i < N; i++) {
final Entity current = //Do some heavy work
progress.set((double) i / N);
results.add(current);
}
return results;
}
public double getProgress() {
return progress.get();
}
public ReadOnlyDoubleProperty progressProperty() {
return progress.getReadOnlyProperty();
}
}
Ora puoi semplicemente osservare la progressProperty o aggiungere un listener, che è abbastanza bello, ma ingombra l'API un po '. Inoltre, è anche possibile che una classe abbia una dipendenza su javafx
se non verrà utilizzata in alcuni casi?
2. Il modo ingenuo: aggiungi consumatori al metodo chiamato
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
public class ExampleFetcher {
public List<Entity> fetch(final Consumer<Double> progressConsumer) {
final List<Entity> results = new ArrayList<>();
for (int i = 0; i < N; i++) {
final Entity current = //Do some heavy work
progressConsumer.accept((double) i / N);
results.add(current);
}
return results;
}
}
Puoi passare un consumatore che aggiornerà la barra di avanzamento o qualsiasi altra cosa tu stia utilizzando nella GUI. Questo evita la dipendenza da javafx
ma aggiunge molta confusione all'API, specialmente se non stai monitorando solo i progressi ma qualche altro tipo di stato.
Ora, c'è un altro modo a cui non sto pensando? Uno dei modi forniti è effettivamente decente? O dovrei forse cercare un altro modo di eseguire i miei compiti?