2017-01-27 16 views
3

Я использую java.util.Properties для проекта, над которым я работаю. У меня есть класс, который управляет файлом .properties с экземпляром Properties, который называется PropertiesManager. Этот класс управляет загрузкой и сохранением файла .properties с диска.Инкапсулирование java.util.Properties доступа через методы доступа, которые считаются плохой практикой?

Теперь, поскольку я хотел убедиться, что можно получить доступ только к действительным свойствам и значения по умолчанию использовались всякий раз, когда свойство не находится в файле, я добавил геттеры и сеттеры для каждого свойства файла.

Проблема в том, что класс PropertiesManager очень большой. Только получатели и сеттеры (с комментариями/пустые строки) составляют 300 строк кода. Поэтому, даже если я переношу загрузку/сохранение в другой класс (наследование и т. Д.), Он по-прежнему остается большим.

Это не реальный код, но это дает вам идею:

import java.util.Properties; 

public class PropertiesManager { 
    private Properties properties; 

    public PropertiesManager() { 
     // constructor 
    } 

    private void save() { 
     // save in .properties file 
    } 

    private void load() { 
     // load from .properties file 
    } 

    public String getPropertyName1() { 
     return properties.getProperty("PropertyName1", "Property1DefaultValue"); 
    } 

    // 28 more getters here 

    public String getPropertyName30() { 
     return properties.getProperty("PropertyName30", "Property30DefaultValue"); 
    } 

    public void setPropertyName1(String value) { 
     properties.setProperty("PropertyName1", value); 
    } 

    // 28 more more setters here 

    public void setPropertyName30(String value) { 
     properties.setProperty("PropertyName30", value); 
    } 
} 

она считается плохой практикой, чтобы инкапсулировать доступ к экземпляру свойств, как это? Должен ли я просто использовать экземпляр Properties напрямую, а не использовать методы доступа? Есть ли другое решение?

ответ

5

я бы просто изменить его, чтобы иметь один геттер/сеттер с помощью перечисления:

public class PropertiesManager { 
    ... 
    public String getProperty(EnumProp enumProp) { 
     return properties.getProperty(enumProp.getKey(), enumProp.getDefaultValue()); 
    } 

    public void setProperty(EnumProp enumProp, String value) { 
     properties.setProperty(enumProp.getKey(), value); 
    } 
} 

С помощью этого перечисления:

public enum EnumProp { 
    PROP_1("key", "defaultValue"), 
    ... 

    EnumProp(String key, String defaultValue){ 
     this.key = key; 
     this.defaultValue = defaultValue; 
    } 
} 
+0

Иисус! Такая же идея, я был слишком медленным :( – jensgram

+0

Спасибо за отличный ответ! Это решение удовлетворяет всем моим требованиям и очень элегантно! – ConveniencePatterns

1

она считается плохой практикой, чтобы инкапсулировать доступ к экземпляр свойств как это? Должен ли я просто использовать экземпляр свойств напрямую, а не использовать методы доступа? Есть еще решение?

Это довольно громоздкое решение.

Я думаю, что он будет более удобным и удобным для чтения, если вы используете файлы свойств, которые содержат все значения по умолчанию для ключей, где должно использоваться значение по умолчанию, если оно не указано.

Преимущество этого решения в том, что вам не нужно изменять код, чтобы изменить значение по умолчанию. Вам просто нужно изменить файл свойств по умолчанию, который может находиться за пределами упаковки вашего приложения.

В вашем PropertiesManager класса-оболочки, обеспечивают аналог public String getProperty(String key) метода в getProperty() способе Properties класса и, если значение не предусмотрено в эффективных свойствах файла, используйте свойства по умолчанию файл, чтобы вернуть значение по умолчанию, если он существует в.

public String getProperty(String key) { 
    String value= properties.getProperty(key); 
    if (StringUtils.isEmpty(value)){ 
      value= propertiesDefault.getProperty(key); 
    } 
    return value; 
} 

Вы можете положиться на ту же логику для метода setProperty().

+0

Спасибо за вашу идею. Думаю, я буду использовать вариант перечисления, который был предложен в двух других ответы, потому что он гарантирует, что в качестве параметра могут использоваться только действительные ключи. – ConveniencePatterns

+0

Благодарим вас за отзыв :) – davidxxx

1

Это делает имеет смысл инкапсулировать экземпляр Properties. То, что вы было бы, как разоблачить - это экземпляр того, что делегирует основной пример Properties.Я предлагаю вам перечислить все поддерживаемые proerties уменьшить публичный интерфейс PropertiesManager:

public class PropertiesManager { 
    public enum Property { 
     SOMETHING("PropertyName1", "PropertyName1DefaultValue"), 
     ANOTHER("PropertyNameX", "PropertyNameXDefaultValue"), 
     …; 

     public final String key; 
     public final String defaultValue; 

     Property(String key, String defaultValue) { 
      this.key = key; 
      this.defaultValue = defaultValue; 
     } 
    } 

    private Properties properties; 

    public PropertiesManager() { 
    } 

    private void save() { 
     // save in .properties file 
    } 

    private void load() { 
     // load from .properties file 
    } 

    public String get(Property property) { 
     return properties.getProperty(property.key, property.defaultValue); 
    } 

    public void set(Property property, String value) { 
     properties.setProperty(property.key, value); 
    } 
} 

Теперь вы можете просто вызвать propertyManager.get(SOMETHING) и так далее.

+0

Очень похоже! Великие умы ... :) – alexbt

+0

Также вам: Спасибо за отличный ответ! Это решение удовлетворяет всем моим требованиям и очень элегантно! – ConveniencePatterns

+0

Не беспокойтесь :) (наполнитель, 15 символов) – jensgram