Java - 如何简化我的Java代码

3

我正在使用Spring Framework编写一些Java代码。

我有两个bean,person和person1。它们的结构略有不同,也就是说每个变量的名称略有不同。

我试图将一个bean的详细信息复制到另一个bean中。只有当值不为空时,才想要复制该值。我看到了一个名为BeanUtils的API,但它将无论是否为空都进行复制。

这是我的代码:

if (person != null) {
       if (person.getAddressDetails() != null) {
               if (person.getAddressDetails().getStreetNumber() != null) {
                       person1.getAddressDetails().setStreetNo(person.getAddressDetails().getStreetNumber());
               }

               if (person.getAddressDetails().getStreetName() != null) {
                       person1.getAddressDetails().setStreetName(person.getAddressDetails().getStreetName());
               }
       }

       if (person.getHomeDetails() != null) {
               if (person.getHomeDetails().getPhoneNumber() != null) {
                       person1.getHomeDetails().setSPhoneNo(person.getHomeDetails().getPhoneNumber());
               }
       }
}

我有大约40个节点需要复制,这将创建很多丑陋的代码。有没有更好的方法?也许我可以创建一个映射或其他东西,然后通过循环来执行它?不确定。
如果没有,有没有人知道是否可以使BeanUtils在不复制空值的情况下运行复制?
原因是第二个bean(person1)已经有了一堆值。我只想在有新值需要覆盖时才进行覆盖。
通常变量是较大系统的一部分,我无法标准化名称。
谢谢

如果所有的值都是由标准的getter/setter方法定义的,你可以使用反射来查找字段,并且只在字段不为空时执行复制操作。然而,这样做会将if/else块替换为try/catch块和反射代码。 - BobG
我不熟悉反射,你能解释一下吗? - Jason
你并没有明确地说,但我可以假设person和person1是同一个类的实例,这样对吗? - Dónal Boyle
他们明确表示personperson1不是同一类的实例。"它们具有稍微不同的结构,也就是说每个变量的名称略有不同。" - user177800
寻找替代方案而不是编写一堆难以维护的样板代码,这是一个明智的选择。 - user177800
@Jarrod,谢谢你的点赞。person1person是不同的类。 - Jason
2个回答

5
从另一个方向解决问题,您的源数据对象不应关心目标对象的约束条件或业务逻辑要求。这将造成紧密耦合并且不好,尤其是如果您正在使用Spring,那么您正在做与IoC容器(例如Spring)试图帮助您避免的事情相反的事情。将"null checking"编码放在目标对象的"setXXX()"方法中,这是处理业务规则的正确位置,如果您永远不想在源属性为"null"的情况下设置目标属性,则应在此处进行处理。
public setXXX(final String s)
{
  if (s == null) { // do nothing }
  else { this.xxx = s; }
}

那么你可以使用任何映射策略/库,而不必担心源数据的null状态。盲目地设置属性并让目标决定何时忽略传入的null


a) 如果存在覆盖非空属性的通用业务规则,这可能很难为复杂系统概括;b) 将特定逻辑添加到使用ORM持久化的对象中,如果尝试合并(),最终会让你的生活变得非常困难。 - BobG
他们没有提到ORM或任何这些问题。我坚持我的答案,类应该决定它的“nullablity”而不是外部实体,这是紧密耦合并破坏封装引入低内聚并使调试成为一场噩梦。OOA最佳实践是松散耦合和高内聚。像“person”和“person1”这样糟糕的类名,我认为OP并不真正关心理论上的企业级问题,他们只想用最少的代码将属性数据从一个类映射到另一个类。 - user177800

2
我不知道是否有帮助,您可以尝试使用Dozer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接