Как избежать жесткого кодирования в Java

Я прочитал много статей о том, как избежать жесткого кодирования в Java. Но не смог получить четкое представление о том, как применять его по моему требованию. После проведения некоторых исследований я задаю этот вопрос. Ниже мой фрагмент кода. В этом я хочу избежать жесткого кодирования имени пути в Process pr = rt.exec(). Любые предложения о том, как это сделать?

public class StartUp {

String executable = getStringValue("executable.run");
    String filein = getStringValue("incoming.file");
    String params1 = getStringValue("executable.params1");
    String params2 = getStringValue("executable.params2");
    String log = getStringValue("log.file");
String ss = "Started";
public String startCommand() throws IOException, InterruptedException{



Runtime rt = Runtime.getRuntime();
//Process pr = rt.exec("C:\\server\\rd.exe -a C:\\file.lic -z[+] // C:\\File\\log.txt");

Process pr = rt.exec(executable+" "+params1+" "+filein+" "+params2+" "+log);
    BufferedReader input = new BufferedReader(new InputStreamReader 
(pr.getInputStream()));

String line=null;
StringBuffer start= new StringBuffer();
    while((line=input.readLine()) != null) {
                start.append("ServerStarted" + line + "\n");
        System.out.println(line);
}

int exitVal = pr.waitFor();
System.out.println("Exited with error code "+exitVal);
return line;



//return start.toString();
}
private static String getStringValue(String string) {
    return string;

}
}

3 ответа

Решение

У вас есть несколько вещей, чтобы попробовать:

СВОЙСТВА ЯВЫ

private Properties _properties;

private void init(){
     _properties = new Properties();
     InputStream configurationFileIS = PropertiesConfigurationHandler.class.getClassLoader().getResourceAsStream(CONFIGURATION_FILE);
     _properties.load(configurationFileIS);
}

public String getStringValue(String path) {
    return _properties.getProperty(path);
}

и файл свойств будет похож на

an.element.to.be.configured.like.a.path=/dev/null

Но вы также можете использовать ВЕСНОЙ КОНТЕКСТ

<bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>WEB-INF/classes/config/properties/database.properties</value>
            <value>classpath:config/properties/database.properties</value>
        </list>
    </property>
    <property name="ignoreResourceNotFound" value="true"/>
</bean>

и элементы в database.properties будут доступны таким образом

"${jdbc.username}"

-

Для вашей конкретной проблемы.

Вы можете создать файл constants.properties

executable.run=C:\\server\\rd.exe
incoming.file=C:\\file.lic
executable.params=-z
log.file=C:\\File\\log.txt

и после инициализации вы вызываете getStringValue:

String executable = getStringValue("executable.run");
String filein = getStringValue("incoming.file");
String params = getStringValue("executable.params");
String log = getStringValue("log.file");

Тогда вы можете сделать rt.exec и вместо использования жестко закодированных строк, вы можете использовать те, которые вы извлекли раньше.

  • Используйте системное свойство, например, -Dpath=... а также System.getProperty("path");
  • Используйте файл конфигурации
  • Передайте это в командной строке
  • Получите это от JNDI
  • И т.п.

Другими словами, существует множество разных способов, лучшее из которых зависит от ваших реальных потребностей.

Вы также можете просто присвоить строку с хорошо названным private final static String, Таким образом, код становится более читабельным (и его легче обновлять, если вам потребуется изменить его позже).

private final static String rtCommand = ""C:\\server\\rd.exe -a C:\\file.lic -z[+] C:\\File\\log.txt";//or something more smartly named. You would know what to name it.
....
Process pr = rt.exec(rtCommand);
Другие вопросы по тегам