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);
}
}
少し背景。私はこのクラスをスーパークラスとして、XMLファイルからオブジェクトを表すさまざまなクラスに使用しています。これは基本的にAPIラッパーの実装であり、これをAPIとデータベースの解析済みXML間のアダプターとして使用しています。キャストはgetメソッドの呼び出し側に委譲されます。サブクラスが作成されたときや変数を返すときに何かをする必要がある場合、スーパークラスを呼び出してその後に返されるものを操作するだけです。例えば:私はこれを行う必要があるように私は感じXMLに格納されたオブジェクトの型なしラッパークラスを使用すると、これは悪いですか?
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);
}
}
}
理由は、私は、彼らが異なる属性を持っているという理由だけでのgetId、のgetName、すべての単一のサブクラスのgetWhateverメソッドを記述する必要はありませんです。それは時間を節約し、かなり自明です。
これは明らかに「unJavalike」であり、物事をやり遂げるのに慣れ親しんだ言語の方法によく似ていますが、これを絶対にしてはいけないという論理的な理由がありますか?
getString、getInt、...メソッドを記述してみませんか? – thejh
これには本質的に間違ったことは何もありません。サブクラスのユーザーが特定のオブジェクトだけをクラスに入れることを知っている限り、途中でキャストしても問題はありません。 – Falmarri
私はあなたのタイトルをちょっと変えました。まだあなたの意図に合っているかどうかを見てください。 :D –