Presumo che l'esempio di codice che mostri sia solo un esempio semplificato e che il vero problema sia più complesso, così da meritare l'utilizzo di un modello.
- Crea
CustomClass
una classe esterna (*).
- avere diversi processori che implementano la stessa interfaccia
- Avere una mappa dei processori che usa il numero intero che identifica il formato della linea CSV come chiave (la si chiama x).
- Recupera un processore dalla mappa (con la chiave correspoding) e falla elaborare la linea.
- Questo simile al modello di strategia , definisce una famiglia di algoritmi, incapsula ciascun algoritmo e rende gli algoritmi intercambiabili all'interno di quella famiglia.
Vantaggi: flessibilità, se crei la mappa dei processori all'esterno del gestore e la passi nel costruttore, più processori possono essere aggiunti in seguito e Handler non dovrà essere modificato (ad esempio per aggiungere un nuovo caso la struttura di controllo dell'interruttore).
(*)Èpossibileottenereglistessirisultaticonl'interfaccia,iprocessorielaclassepersonalizzatacomeclassiinterne/interfacceall'internodiHandler,mainquinerebbemoltolasoluzione.
==>CustomClass.java<==
public class CustomClass {}
== > IMessageProcessor.java < ==
import java.util.Map;
public interface IMessageProcessor {
public void processLine(Map<String, CustomClass> map, String line);
}
== > ProcessorA.java < ==
import java.util.Map;
public class ProcessorA implements IMessageProcessor {
@Override
public void processLine(Map<String, CustomClass> map, String line) {
// TODO Auto-generated method stub
}
}
== > ProcessorB.java < ==
import java.util.Map;
public class ProcessorB implements IMessageProcessor {
@Override
public void processLine(Map<String, CustomClass> map, String line) {
// TODO Auto-generated method stub
}
}
== > ProcessorC.java < ==
import java.util.Map;
public class ProcessorC implements IMessageProcessor {
@Override
public void processLine(Map<String, CustomClass> map, String line) {
// TODO Auto-generated method stub
}
}
== > Handler.java < ==
import java.util.HashMap;
import java.util.Map;
public class Handler {
private Map<String, CustomClass> map = new HashMap<String, CustomClass>();
private Map<Integer,IMessageProcessor> processors = new HashMap<Integer,IMessageProcessor>();
public processFile(){
// store the processors in their map with the appropiate keys
processors.put(1, new ProcessorA());
processors.put(2, new ProcessorB());
processors.put(3, new ProcessorC());
// Read the huge CSV file with millions of records, line by line
// for each line, get the string before the first comma (say x)
processors.get(x).processLine(map,line);
}
}
Nota: potresti voler prima convalidare se il processore per la chiave x esiste, e non lo fa, ricorrere a un processore predefinito, ad esempio, memorizzato con la chiave -1, o qualsiasi altro valore garantito per non esistere nel file CSV.