如何使用来自另一个不相关对象的数据快速填充Java对象?

jso*_*son 5 java

如何使用来自任何其他任意对象的数据填充简单的Java对象?

例如,我最终得到一个Document对象,其子节点我可以遍历,我想在另一个对象中使用节点的值设置同名属性.

我主要在动态语言中工作,我认为我很想知道这在perl或javascript中是如何工作的,并且不能让我的脑袋远离动态排水沟足够长时间才能清楚地看到这一点.

我知道我可以做类似的事情(伪代码)

while (key = nextKey) {
    if (key.name == "fooBar") {
        object.setFooBar(key.value);
    } else if (key.name == "bazQux") {
        object.setBazQux(key.value);
    }
    ...etc...
}
Run Code Online (Sandbox Code Playgroud)

但是这感觉并不好,当属性或复杂性增加时感觉很糟糕.

在动态语言中,我会做类似的事情:

while (key = nextKey) {
    object.setField(key.name, key.value);
    // or even
    object.[key.name] = key.value;
}
Run Code Online (Sandbox Code Playgroud)

where setField可以是带代码引用的调度表.我知道默认情况下我没有奢侈的每个对象都是哈希,但我正在寻找一般建议.你会怎么做?

一个开关/盒子会好一点,但java抱怨它不喜欢这样的语句中的字符串.枚举会成为解决方案吗?</盲目刺伤答案>

我已经研究过使用反射来实现某种自动调度表,但这让我感到沮丧,并且必须有更好的方法.

感谢您的任何见解.

Ros*_*oss 3

再次投票支持反思。您在这里尝试做的是将非类型化字符串数据自动绑定到类型化 Java 变量。这只是需要反思。

反射之所以被“看不起”,是因为一般来说,盲目地将非类型化的String数据绑定到类型化的Java变量上是“被看不起”的。在许多情况下,最好(例如)让您的对象显式地仅提取它需要的数据。例如:

this.fooBar = doc.get("fooBar");
this.bazQux = doc.get("bazQux");
// ... etc.
Run Code Online (Sandbox Code Playgroud)

您可能会说,“但是现在如果我sysBiz向文档中添加一个条目,我必须记住向构造函数中添加一行。在动态语言中,它会正常工作[tm]!” 确实如此,但在 Java 中,您必须添加sysBiz成员变量、getter 和 setter,以及所有其他逻辑sysBiz,因此构造函数或反序列化部分中的额外行并不是那么麻烦。另外,它明确了您关心文档的哪些部分,因此如果有人zigBlog向文档添加条目,它不会导致您的自动绑定出现问题(例如看起来像 的东西object.setField(key, val)),抛出有关不存在字段的运行时错误zigBlog

尽管如此,有时自动将非类型化 String 数据绑定到类型化 Java 变量正确的方法,而反射是在这种情况下使用的正确工具。确保自动绑定确实是您所拥有的数据结构的最佳选择,但是一旦您确定,就没有必要因为反射“被轻视”或者是稍微高级的部分而犹豫使用反射。语言。这正是它的用途。