1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| class MyProperties extends Properties {
private final Map<Class<?>, Function<String,?>> converters = new HashMap<>();
public MyProperties() {
addConverter(Double.class, Double::valueOf);
addConverter(Float.class, Float::valueOf);
addConverter(Integer.class, Integer::valueOf);
addConverter(Short.class, Short::valueOf);
addConverter(Boolean.class, Boolean::valueOf);
addConverter(String.class, Function.identity());
// ... etc pour tous les types qu'on veut supporter de base...
}
public <T> void addConverter(Class<T> clazz, Function<String,T> func) {
this.converters.put(clazz, func);
}
public <T> Function<String,T> getConverter(Class<T> clazz) {
// Ceci n'est correct que si la Map est correctement renseigné
// (cad seulement via la méthode addConverter)
@SuppressWarnings("unchecked")
Function<String,T> func = (Function<String,T>) this.converters.get(clazz);
if (func==null) {
throw new IllegalStateException("Missing converter for type " + clazz);
}
return func;
}
public <T> T getValue(final String key, final Class<T> clazz) {
String value = this.getProperty(key);
if (value==null) {
return null;
}
return getConverter(clazz).apply(value);
}
} |
Partager