Пытаясь сделать мою свойств перечислимого основе одноэлементного


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

Поставщик свойство перечислимого:

public enum PropertyProvider implements CanProvideProperties {

    INSTANCE;
    private final HashMap<String, String> properties;

    PropertyProvider() {
        properties = buildSettingsMap();
    }

    @Override
    public HashMap<String, String> getAllProperties() {
        return properties;
    }

    @Override
    public String getProperty(Property prop) {
        return properties.get(prop.toString());
    }

    @Override
    public HashMap<String, String> buildSettingsMap() {
        HashMap<String, String> temp = new HashMap<>();
        Properties prop = new Properties();
        try {
            prop.load(readFile("src/test/resources/framework.properties"));
        } catch (IOException ignore) {
            throw new RuntimeException("Framework properties file non accessible");
        }

        Enumeration<Object> KeyValues = prop.keys();
        while (KeyValues.hasMoreElements()) {
            String key = (String) KeyValues.nextElement();
            String value = prop.getProperty(key);
            temp.put(key, System.getProperty(key, value));
        }
        return temp;
    }

    @Override
    public FileInputStream readFile(String file) throws FileNotFoundException {
        return new FileInputStream(new File(file));
    }

}

Который реализует следующий интерфейс:

public interface CanProvideProperties {
    String getProperty(Property prop);
    HashMap<String, String> getAllProperties();
    HashMap<String, String> buildSettingsMap();
    FileInputStream readFile(String file) throws FileNotFoundException;

}

и, наконец, еще одно перечисление, чтобы провести некоторые настройки:

public enum Property {
    BROWSER {
        @Override
        public String toString() {
            return "browser";
        }
    },

    TESTENVIRONMENT {
        @Override
        public String toString() {
            return "env.baseurl";
        }
    },

    GRIDADDRESS {
        @Override
        public String toString() {
            return "grid.endpoint";
        }
    },

    LOCALORGRID    {
        @Override
        public String toString() {
        return "grid.or.local";
    }
    },

    PLATFORM {
        @Override
        public String toString() {
            return "platform";
        }
    },

    LANGUAGE {
        @Override
        public String toString() {
            return "application.language";
        }
    },

    PRODUCTNAME {
        @Override
        public String toString() {
            return "product.name";
        }
    },

    DATABASEURL {
        @Override
        public String toString() {
            return "database.url";
        }
    },

    BASEADMINACCOUNT {
        @Override
        public String toString() {
            return "base.admin.account";
        }
    },

    BASEADMINUSERNAME {
        @Override
        public String toString() {
            return "base.admin.username";
        }
    },

    BASEADMINPASSWORD {
        @Override
        public String toString() {
            return "base.admin.password";
        }
    },    
}


Комментарии
1 ответ

Property-перечисление

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

public enum Property {
BROWSER("browser"),
TESTENVIRONMENT("env.baseurl"),
... // add more here.
;

private final String key;

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

public String getKey() {
return this.key;
}

@Override public String toString() {
return getKey();
}
}

Вообще нет никакой логики, основанные на toString. Этот метод в основном предназначен для отладки. С помощью getKey() вместо этого (как и выше) позволяет использовать getKey() для приложения логики.

Это синглтон действительно необходимо?

Спросите себя, если вам действительно нужен синглетон (подсказка: ответ скорее всего "нет"). Вы могли бы использовать инъекции зависимостей для передачи объекта на классы, которые в ней нуждается.

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

1
ответ дан 3 февраля 2018 в 11:02 Источник Поделиться