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);
}
}
Teraz małe tło. Używam tej klasy jako super klasy do grupy różnych klas, które reprezentują obiekty z pliku XML. Jest to w zasadzie implementacja wrappera API i używam go jako adaptera pomiędzy sparsowanym XML z API a bazą danych. Przesyłanie jest delegowane do wywołującego metodę get. Jeśli podklasy muszą coś zrobić, gdy są tworzone lub zwracają zmienną, po prostu wywołują super, a następnie manipulują tym, co zostanie zwrócone później. np .:Używanie nienumerowanej klasy otoki wokół obiektów przechowywanych w XML, jest takie złe?
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);
}
}
}
Powodem czuję się jak zrobić to tak nie mam do napisania getId, getName, metody getWhatever dla każdej podklasy tylko dlatego, że mają różne atrybuty. Zaoszczędziłoby to czas i jest dość oczywiste.
Teraz jest to oczywiście "nieślubne" i bardziej jak kunsztowny język, ale czy istnieje logiczny powód, dla którego absolutnie nie powinienem tego robić?
Dlaczego nie napiszesz getString, getInt, ... metod? – thejh
Nie ma w tym nic nie w porządku (imo). Dopóki użytkownicy podklasy wiedzą, że umieszczają tylko pewne przedmioty w klasie, nie ma nic złego w tym, że rzucają je w drogę. – Falmarri
Zmieniłem trochę tytuł, zobacz, czy nadal pasuje do twojego zamiaru. : D –