class MyThing {
protected HashMap<String,Object> fields;
protected MyThing(HashMap<String,Object> newFields){
fields.putAll(newFields);
}
protected Object get(String key){
return fields.get(key);
}
}
Ahora un poco de historia. Estoy usando esta clase como una súper clase para un grupo de diferentes clases que representan objetos de un archivo XML. Esto es básicamente una implementación de un contenedor de API y lo estoy usando como un adaptador entre el XML analizado de una API y una base de datos. Casting se delega a la persona que llama del método get. Si las subclases necesitan hacer algo cuando se crean o cuando devuelven una variable, simplemente llaman a super y luego manipulan lo que se devuelve después. ej .:Usar una clase contenedora sin tipo alrededor de objetos almacenados en XML, ¿es malo?
class Event extends MyThing {
public Event(HashMap<String,Object> newFields){
super(newFields);
// Removes anything after an @ symbol in returned data
Pattern p = Pattern.compile("\\@.*$");
Matcher m = p.matcher((String)fields.get("id"));
boolean result = m.find();
if (result)
fields.put("id", m.replaceFirst(""));
}
}
public Object get(String key){
Object obj = super(key);
if (key.equals("name")){
return "Mr./Mrs. " + ((String)obj);
}
}
}
La razón por la que siento que debería hacer esto es por lo que no tengo que escribir getId, getNombre, métodos getWhatever para cada subclase sólo porque tienen diferentes atributos. Ahorraría tiempo y es bastante auto explicativo.
Ahora bien, esto es obviamente "unJavalike" y más como una forma de hacer lenguaje en forma de pato, pero ¿hay alguna razón lógica por la que no debería estar haciendo esto?
¿Por qué no escribes los métodos getString, getInt, ...? – thejh
No hay nada intrínsecamente incorrecto con esto (imo). Mientras los usuarios de la subclase sepan que solo colocan ciertos objetos en su clase, no hay nada de malo en que los arrojen a la salida. – Falmarri
Cambié un poco el título, veo si todavía se adapta a tu intención. : D –