我有几种情况,其中一个类由任意(但固定)数量的不同类型的变量组成,并希望迭代这些变量并在代码中使用它们的名称。有没有比在每个函数中重新键入每个变量名更聪明的方法呢?
我最初的想法是使用 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();
}
我一直认为必须有一种模式来做这种事情,但也许这只是我的 Python 历史对我的 Java 经验的影响。
更新:这不仅仅是从成员变量中获取 XML,而是在多个成员函数中循环访问成员变量。看来我的曲目中缺少 Java 的反射功能。
我新的较小的构造函数让我很高兴学到了一些有用的东西,看起来像:
public Widget(Widget other) {
for (Field f : getClass().getDeclaredFields()) {
if (f.getName() == "TAG") {
continue;
}
f.set(this, f.get(other));
}
}