В настоящее время я реализую симуляцию на Java, которая требует ввода около 30 различных параметров.В конце концов, я хочу иметь возможность читать эти параметры из файла, а также из графического интерфейса, но сейчас я сосредоточен только на вводе файла.Для моего моделирования требуются параметры разных типов: строки, целые и двойные числа, и в настоящее время я имею их в качестве полей для моделирования, например:
private String simName;
private int initialPopulationSize;
private double replacementRate;
Поскольку эти параметры не все одного типа, я не могу их сохранитьв массиве, и я должен прочитать каждый в отдельности, используя один и тот же вид кода около 30 раз.Пример для трех параметров:
//scanner set up and reading each line, looking for "(key)=(param)" regex matches
//if statement to check each param name against the key matched in file. Store param in that field if the name matches.
String key = m.group(1);
if (key.equals(PKEY_SIM_NAME)) {
if (simNameSet) {
throw new IllegalStateException("multiple values for simulation name");
}
this.simName = m.group(2);
simNameSet = true;
} else if (key.equals(PKEY_INITIAL_SIZE)) {
if (initialSizeSet) {
throw new IllegalStateException("multiple values for initial population size");
}
this.initialPopulationSize = Integer.parseInt(m.group(2));
initialPopulationSize = true;
} else if (key.equals(PKEY_MUT_REPLACEMENT)) {
if (replacementRateSet) {
throw new IllegalStateException("multiple values for replacement rate");
}
this.replacementRate = Double.parseDouble(m.group(2));
replacementRateSet = true;
}
//Add nauseum for each parameter.....
Так что в настоящее время у меня есть длинный и неудобный метод для чтения параметров, и мне, вероятно, потребуется снова сделать то же самое для чтения из графического интерфейса.
Лучшая альтернатива, о которой я подумал, - это сначала прочитать все в строковые поля.Таким образом, я могу написать несколько простых строк для чтения при использовании карты.Примерно так (непроверенный код):
//This time with a paramMap<String, String>, scanner set up as before
if (!paramMap.containsKey(key)) {
paramMap.put(key, m.group(2));
}
else{
throw new IllegalStateException("multiple values for initial population size");
}
Однако это будет неудобно, когда речь заходит об использовании этих параметров с карты, так как мне придется приводить не-строковые параметры всякий раз, когда я хочуиспользовать их.
На данный момент я чувствую, что это мой лучший подход.Я хочу знать, может ли кто-нибудь более опытный придумать более эффективную стратегию для решения подобных ситуаций, прежде чем я продолжу.