java - 为什么这里使用克隆?
问题描述
我正在阅读 Vaadin 教程并遇到了这段代码。但是我无法理解clone
在这种情况下的目的。谁能解释一下?
/**
* Persists or updates customer in the system. Also assigns an identifier for
* new Customer instances.
*
* @param entry
*/
public synchronized void save(Customer entry) {
if (entry == null) {
LOGGER.log(Level.SEVERE,
"Customer is null. Are you sure you have connected your form to the application as described in tutorial chapter 7?");
return;
}
if (entry.getId() == null) {
entry.setId(nextId++);
}
try {
entry = (Customer) entry.clone();
} catch (Exception ex) {
throw new RuntimeException(ex);
}
contacts.put(entry.getId(), entry);
}
/**
* Sample data generation
*/
public void ensureTestData() {
if (findAll().isEmpty()) {
final String[] names = new String[] { "Gabrielle Patel", "Brian Robinson", "Eduardo Haugen",
"Koen Johansen", "Alejandro Macdonald", "Angel Karlsson", "Yahir Gustavsson", "Haiden Svensson",
"Emily Stewart", "Corinne Davis", "Ryann Davis", "Yurem Jackson", "Kelly Gustavsson",
"Eileen Walker", "Katelyn Martin", "Israel Carlsson", "Quinn Hansson", "Makena Smith",
"Danielle Watson", "Leland Harris", "Gunner Karlsen", "Jamar Olsson", "Lara Martin",
"Ann Andersson", "Remington Andersson", "Rene Carlsson", "Elvis Olsen", "Solomon Olsen",
"Jaydan Jackson", "Bernard Nilsen" };
Random r = new Random(0);
for (String name : names) {
String[] split = name.split(" ");
Customer c = new Customer();
c.setFirstName(split[0]);
c.setLastName(split[1]);
c.setStatus(CustomerStatus.values()[r.nextInt(CustomerStatus.values().length)]);
c.setBirthDate(LocalDate.now().minusDays(r.nextInt(365 * 100)));
save(c);
}
}
}
注意:Customer
具有以下数据成员:private Long id, private String firstName = "", private String lastName = "", private LocalDate birthDate, private CustomerStatus status, private String email = ""
解决方案
您的save
方法是公开的,因此可以从任何地方调用。如果有人保存了一个客户,然后又更改了他们保存的客户对象,那么您不希望新的更改反映在您所拥有的内容中contacts
。在那里保存克隆可确保您不受他们所做的事情的影响。
但是假设 save 方法不是从 以外的任何地方调用的
ensureTestData()
,我们还需要克隆它吗?
从技术上讲,短期内没有。无论您的ensureTestData
方法是保存它创建的客户还是复制它的客户,都没有区别。但是,在这种情况下,您需要将save
方法声明为私有,否则您将不知道何时有人从某个地方引入了对它的调用。在许多情况下,仍然会克隆以防止将来对代码的更改造成不必要的影响。
推荐阅读
- css - 当屏幕宽度减小时,如何创建媒体查询自由流体宽度以增加?
- c# - 创建一个列表
对象上的类 - java - 如何删除字符串值中的所有前缀数字?
- asp.net - .net core 2.2 无法从请求中检索 JWT 令牌
- string - 字符串中连续 1 的最大数量
- node.js - sequelize Node JS中基于条件的条件
- c# - 如何在 ado.net 中编写由数据字典组成的查询
- java - 在后台可运行线程中改造arraylist response.body()错误
- php - 直接在 youtube 上上传视频时将视频状态设置为非活动状态
- sql - SQL 查询返回 a >= some_value 并且 b 是给定 a 的最大值