【发布时间】:2021-11-29 02:21:24
【问题描述】:
先简单解释一下。 假设我们有一个方法,它将一个 Student 对象和一个 Id 作为属性,并使用传递的对象中包含的信息更新具有给定 Id 的学生。到目前为止,我找到的最简单的解决方案如下:
- 我们搜索我们的存储库以寻找我们想要更新的学生。
- 如果我们找到它,然后我们使用 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);
这是可能的还是只是我的一厢情愿?下一个最好的事情可能是创建一个可以由我自己完成所有这些的方法,但这仍然不是一个完美的解决方案,因为每次类属性更改时也必须对其进行编辑。
【问题讨论】:
-
当属性被允许为基元以外的东西时,事情会变得很糟糕。好的,字符串也不难,因为它们是不可变的(并且其他不可变类型可能很容易处理)。但是对于其他类型的属性,首先要确定是否需要深拷贝。在深拷贝的情况下,必须考虑与原始类相同的考虑。最后,只有非常简单的类才能从这种“干净替换”的方式中受益。