迭代Java中的成员变量

mik*_*ock 4 java oop variables iterator hashmap

我有几种情况,一个类由不同类型的任意(但固定)数量的变量组成,并希望迭代这些变量以及在代码中使用它们的名称.有没有更聪明的方法来重新键入每个函数中的每个变量名称?

我最初的想法是使用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>";
    }
}
Run Code Online (Sandbox Code Playgroud)

相反,我宁愿做类似(伪代码)的事情:

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();
}
Run Code Online (Sandbox Code Playgroud)

我一直认为必须有一种模式来做这种事情,但也许只是我的Python历史踢我的Java经验.

更新:这不仅仅是从成员变量中获取XML,而是在多个成员函数中循环遍历成员变量.看来我的保留曲目中缺少Java的反射功能.

我新的小构造函数让我很高兴能学到一些有用的东西,看起来像:

public Widget(Widget other) {
    for (Field f : getClass().getDeclaredFields()) {
        if (f.getName() == "TAG") {
            continue;
        }
        f.set(this, f.get(other));
    }
}
Run Code Online (Sandbox Code Playgroud)

mer*_*ike 13

这通常用反射来解决:

for (Field f : getClass().getDeclaredFields()) {
    String name = f.getName();
    String value = f.get(this);
}
Run Code Online (Sandbox Code Playgroud)

但是,对于写入/读取XML,您可能希望使用JAXB而不是重新发明轮子.