Una volta ho affrontato un problema simile. Mentre la mia soluzione non è certamente ottimale, ha fatto il trucco.
Ho usato un livello aggiuntivo tra la compilazione effettiva e la% di corrispondenzaCompiler
utilizzata in modo concorrente. Questa classe si chiamerebbe Compilation
nel tuo esempio.
/*
This class exists once for multiple (simultaneous) inputs
*/
public class Compiler{
CompilationParameters compilationParameters;
public Compiler(CompilationParameters params){
...
}
public CompilationResult compile(CompilationInput input){ // Of course you can simplify this to a string
Compilation compilation = new Compilation(compilationParameters, input);
compilation.compile();
return compilation.getResult();
}
}
/*
This class exists exactly once per input
*/
public class Compilation{
CompilationState state;
public Compiler(CompilationParameters params, CompilationInput input){
...
}
public void compile(){
...
}
public CompilationResult getResult(){
...
}
}
Ora potresti obiettare che questo viola il Principio Aperto-Chiuso. E avresti ragione. Questa soluzione può essere estesa per diversi tipi di compilation utilizzando un modello di fabbrica per la creazione di Compilation
-object. Immagina quanto segue:
public abstract class Compilation{...};
public class CompiletimeOptimizedCompilation extends Compilation{...};
public class RuntimeOptimizedCompilation extends Compilation{...};
public class CompilationFactory{
public static Compilation createCompilation(CompilationType type, CompilationParameters params, CompilationInput input)
{
switch(CompilationType)
{
case eCompileTimeOptimized:
return new CompileTimeOptimizedCompilation(params, input);
case eRuntimeOptimized:
return new RuntimeOptimizedCompilation(params, input);
case ...
}
}
}
In questo caso Compilation
potrebbe anche essere un'interfaccia invece di una classe astratta. Per decidere che probabilmente avrei bisogno di maggiori dettagli sulle implementazioni. E naturalmente il Compiler
-class si ridurrebbe in:
public class Compiler{
CompilationParameters compilationParameters;
public Compiler(CompilationType type, CompilationParameters params){ // This type CAN be part of the parameters
...
}
public CompilationResult compile(CompilationInput input){ // Of course you can simplify this to a string
Compilation compilation = CompilationFactory.createCompilation(type, compilationParameters, input);
compilation.compile();
return compilation.getResult();
}
}
Ovviamente lo stesso funziona per il tuo Parser
-class, ma ho pensato che sarebbe stato un cattivo esempio perché il nome di "analizzare" è "l'analisi".
Se hai ulteriori domande o commenti, non esitare a chiedere.
PS: scusate eventuali errori di ortografia. Non sono nativo.