クラスが任意の (ただし固定の) 数の異なる型の変数で構成され、それらの変数を反復処理し、コードでそれらの名前を使用したいという状況がいくつかあります。各関数で各変数名を再入力するよりもスマートな方法はありますか?
私の最初の考えは、HashMap を使用してローカル変数を格納することですが、それは非効率的で、複数の型を処理できません。
以下のコードは、必要な読み取りを短縮するためにシミュレートされていますが、通常は 3 つ以上の変数です。
class Widget implements Parcelable {
String name, code;
Long price;
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(code);
dest.writeLong(price);
}
public Widget(Parcel o) {
name = o.name;
code = o.code;
price = o.price;
}
public String getXML() {
return "<Widget><name>"+name+"</name><code>"+code
+"</code><price>"+price+"</price></Widget>";
}
}
代わりに、(疑似コード)のようなことをしたいと思います:
public Widget(Parcel o) {
for (Map<Name,Data> item: o.getMap()) {
this.setValue(Name, Data);
}
}
public String getXML() {
StringBuilder XML = new StringBuilder();
XML.append("<Widget>");
for (Map<Name,Data> item: o.getMap()) {
XML.append("<"+Name+">" + Data + "</"+Name+">");
}
XML.append("</Widget>");
return XML.toString();
}
この種のことを行うためのパターンがあるに違いないと私は考え続けていますが、それは私の Java の経験を蹴散らした私の Python の歴史に過ぎないのかもしれません。
更新: これは、メンバー変数から XML をフェッチするだけではなく、複数のメンバー関数でメンバー変数をループすることに関するものです。私のレパートリーには、Java のリフレクション機能が欠けているようです。
私の新しい小さなコンストラクターは、何か役に立つことを学べたことを嬉しく思います。
public Widget(Widget other) {
for (Field f : getClass().getDeclaredFields()) {
if (f.getName() == "TAG") {
continue;
}
f.set(this, f.get(other));
}
}