lory1990 ha scritto:
Ho una classe chiamata punto
public class Point{
public int x;
public int y;
public int z;
}
Sì ma se non ci sono ragioni
davvero valide e importanti, non mettere campi public. Campi private con i metodi "accessori" public.
lory1990 ha scritto:
Io vorrei fare in modo che l'utente che sceglie di esportare un ArrayList<Point> possa scegliere cosa esportare e in che ordine, ovvero deve poter esportare una tabella con x,y oppure y,z,x oppure solo x e così via
Io ho pensato di assegnare ad ogni variabile un "nome" e di creare un metodo fatto così
Questo approccio mi sembra molto time consuming però, avete delle idee migliori?
In questi casi meglio ragionare un po' di più a livello object-oriented. Ad esempio:
Innanzitutto una interfaccia che "cattura" il concetto di estrazione di un valore String da un certo oggetto. Magari la facciamo "generica" (così puoi riutilizzarla anche per altri tipi oltre che Point).
public interface DataExtractor<T> {
String getValue(T t);
}
Poi implementi DataExtractor 3 volte, per ciascuno dei campi di Point. Puoi farlo con una normale classe, con una anonymous inner class o (da Java 8 ) con una lambda expression. Ecco due esempi:
DataExtractor<Point> xExtractor = new DataExtractor<Point>() {
@Override
public String getValue(Point p) {
return String.valueOf(p.getX());
}
};
Oppure con una lambda:
DataExtractor<Point> yExtractor = p -> String.valueOf(p.getY());
A quel punto, secondo come sarà necessario, crei un List<DataExtractor<Point>> (chiaramente es. un ArrayList) in cui inserisci i riferimenti alle implementazioni, quali e in che ordine vuoi.
Quindi il metodo di esportazione sarà:
exportPoints(List<Point> points,
List<DataExtractor<Point>> extractors)
Dovrai naturalmente fare un ciclo sui points e dentro un ciclo su extractors ma hai 2 vantaggi:
- non hai più lo switch (che è brutto in questi casi)
- hai ben separato la logica di generazione del risultato dalla logica di estrazione dei dati (e questo è più object-oriented)
Ah, se devi comporre una lunga stringa, non usare la concatenazione, usa StringBuilder.
P.S. DataExtractor la puoi chiamare come vuoi: così oppure es. StringExtractor, ObjectStringExtractor o che altro.