Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
/**
* Конфигурация программы
*
* 2 конструктора:
- по умолчанию - загружающий данные из файла настроек (см. Configuration.CONFIGURATION_FILENAME);
- с одним параметром java.util.Properties - загружающий данные данные из него.
- метод save()
- без параметра - записывает данные в Configuration.CONFIGURATION_FILENAME
- с одним параметром java.util.Properties - записывает данные в него.
*/
public class Configuration {
public static final String CONFIGURATION_FILENAME = System.getProperty("user.home") + "/serialmon/1.properties";
private PortConfig firstPort;
private PortConfig secondPort;
private String logFileName;
private int logWidth;
public Configuration() {
this.firstPort = new PortConfig();
this.secondPort = new PortConfig();
Properties pp = new Properties();
try {
File PropFile = new File(CONFIGURATION_FILENAME);
if (!PropFile.exists()) {
PropFile.createNewFile();
}
FileInputStream inPropFile = new FileInputStream(CONFIGURATION_FILENAME);
pp.load(inPropFile);
setProperties(pp);
} catch (IOException e) {
e.printStackTrace();
}
}
public Configuration(Properties p) {
this.firstPort = new PortConfig();
this.secondPort = new PortConfig();
setProperties(p);
}
/**
* вспомогательный метод. В идеале можно было обойтись без него, вызывая из конструктора по умолчанию
* конструктор с параметром Properties, но ПЕРЕД вызовом этого конструктора нужно было
* загрузить данные из файла в Properties pp, а потом уже вызвать конструктор.
* Это сделать не возможно, т.к. вызов конструктора должен быть ПЕРВЫМ.
*
* @param pp
*/
private void setProperties(Properties pp){
this.setLogFileName(pp.getProperty("logFileName"));
this.setLogWidth(Integer.parseInt(pp.getProperty("logWidth")));
}
/**
* - метод save()
* без параметра - записывает данные в Configuration.CONFIGURATION_FILENAME
*/
public void save() {
Properties pp = new Properties();
save(pp);
try {
FileOutputStream outPropFile = new FileOutputStream(CONFIGURATION_FILENAME);
pp.store(outPropFile, null);
} catch(IOException ex) {
ex.printStackTrace();
}
}
/**
* - с одним параметром java.util.Properties - записывает данные в него.
*
* @param p
*/
public void save(Properties p) {
p.put("logFileName", this.getLogFileName());
p.put("logWidth", String.valueOf(this.getLogWidth()));
}
Товарищи, возникла необходимость создания двух конструкторов. Хочется вызвать один из другого, чтобы было красиво, НО перед вызовом второго, который с параметром Properties, нужно установить этот самый параметр, а потом уже передать его.
Т.е. нужно в конструкторе по умолчанию сделать такое:
Properties p = new Properties();
p.set(бла бла бла);
THIS(P); // как вы понимаете, компилятор будет ругаться, что вызов THIS должен быть ПЕРВЫМ в конструкторе.
вызов типа this(new Properties), не годится.
сейчас, как можно видеть, использую вспомогательный метод setProperties, как раз без которого было бы идеально.
Ну тогда сделайте либо как советует tir ниже, либо без статики - вынесите код инициализации в отдельный приватный метод. Второй подход удобнее при дальнейшем наследовании - легче изменить поведение.
Именно поэтому я так люблю использовать фабричные методы: до вызова конструктора можно выполнить все проверки и сделать дополнительную работу. пожалуйста, не пишите комменты на русском...
и тогда сможешь сделать
элегантным решением была бы именно фабрика.
луна в матроске
Просто перестань писать на яве.