首页 > 解决方案 > 是否有一种“干净”的方法可以用来自另一个相同类型对象的值替换 Java 中对象的所有属性值?

问题描述

首先快速解释一下。假设我们有一个方法,它将一个 Student 对象和一个 Id 作为属性,并使用传递的对象中包含的信息更新具有给定 Id 的学生。到目前为止,我发现的最简单的解决方案如下:

  1. 我们搜索我们的存储库以寻找我们想要更新的学生。
  2. 如果我们找到它,然后我们使用 setter 来设置新值。
    public void updateStudent(Long id, Student newStudent) {
        Student studentToBeUpdated = studentRepo
                .findStudentById(id)
                .orElseThrow(() ->
                        new UserNotFoundException("Student with id " + id + " was not found"));
        studentToBeUpdated.setFirstName(newStudent.getFirstName());
        studentToBeUpdated.setLastName(newStudent.getLastName());
        studentToBeUpdated.setEmail(newStudent.getEmail());
    }

所以,干得好,我们可以回家了,对吧?好吧,现在假设我们的项目增长了很多,我们必须为 Student 类添加 20 多个属性。突然间,我们必须手动更新此方法以及执行类似操作的任何其他方法。不好。此外,我们刚刚创建了一些不好的样板代码。

我真正在寻找的是一种无需考虑我们的 Student 类有多少属性或这些属性是什么的方法,即使它们本身是枚举、数组甚至其他对象。我想要的是这样的:

studentToBeUpdated.replace(newStudent);

这是可能的还是只是我的一厢情愿?下一个最好的事情可能是创建一个可以由我自己完成所有这些的方法,但它仍然不是一个完美的解决方案,因为每次类属性更改时也必须对其进行编辑。

标签: javaobjectassign

解决方案


对于两个 Java 对象之间的映射,您可以使用MapStruct 之类的东西,或者您可以编写自己的映射器,本质上是将样板代码提取到单独的类/服务中。

如果您决定创建自己的映射器,您可以使用反射,也可以使用setter方法或构建器模式来实现(Lombok@Builder也可以帮助避免为构建器模式编写样板)。

...现在假设我们的项目增长了很多,我们必须向 Student 类添加 20 多个属性。突然间,我们必须手动更新此方法以及执行类似操作的任何其他方法。

当然,您的实体以及因此您的数据库可以增加字段/列的数量,但是如果您提取不同类中的所有映射和转换,这通常不会有什么大不了的。在大多数情况下,无论如何您都必须更新字段的子集。


推荐阅读