J'ai une classe pour POJO avec plusieurs champs comme ceci :
class DataObj {
private String v1 = null;
private String v2 = null;
...
Je veux prendre les valeurs de ces champs dans une carte où les noms des clés sont liés aux noms des champs. Le site data
vient (d'un dispositif externe) dans la carte comme ceci :
V1=11
V2=22
...
Donc, actuellement, je définis un ensemble de constantes et j'utilise un commutateur pour le faire, comme ceci :
private static final String V1 = "V1";
private static final String V2 = "V2";
...
DataObj(Map<String, String> data) {
for (String key : data.keySet()) {
String value = data.get(key);
switch (key) {
case V1:
v1 = value;
break;
case V2:
v2 = value;
break;
...
}
}
}
Cela me semble être une solution très brutale... De plus, j'ai beaucoup de ces champs et ils ne diffèrent que par des caractères uniques, donc écrire un tel bloc de commutation peut être très source d'erreurs. Peut-être que quelqu'un pourrait partager un mécanisme plus astucieux (à côté de la réflexion) pour résoudre de telles tâches ?
EDIT - SOLUTION SÉLECTIONNÉE
En utilisant la réponse sélectionnée, j'ai créé une classe :
abstract class PropertyMapper<T> {
private Map<String, Setter<T>> setters = new HashMap<>();
abstract void mapProperties();
public PropertyMapper() {
mapProperties();
}
protected void updateBean(Map<String, T> map) {
for (String key : map.keySet()) {
setField(key, map.get(key));
}
}
protected void mapProperty(String property, Setter<T> fieldAssignment) {
setters.put(property, fieldAssignment);
}
protected interface Setter<T> { void set(T o); }
private void setField(String s, T o) { setters.get(s).set(o); }
}
Et ensuite, je remplace simplement mapProperties
méthode.
class DataObj extends PropertyMapper<String> {
private String v1 = null;
private String v2 = null;
...
DataObj(Map<String, String> data) {
updateBean(data);
}
@Override
void mapProperties() {
mapProperty("V1", o -> v1 = o);
mapProperty("V2", o -> v2 = o);
...
}
}
Et c'est ce que je recherchais : un mécanisme astucieux permettant d'obtenir un code concis de mise en correspondance des propriétés et des champs.