为什么在这里使用克隆?

时间:2019-02-19 09:47:35

标签: java clone vaadin-flow

我正在阅读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 = ""

1 个答案:

答案 0 :(得分:3)

您的save方法是公共的,因此可以在任何地方调用。如果有人保存了客户,后来又更改了保存的客户对象,则您不希望新的更改反映在contacts中。将副本保存在此处可确保您不受其操作的影响。

  

但是,假设没有从ensureTestData()以外的其他任何地方调用save方法,我们是否仍需要克隆它?

从技术上来说,近视您的ensureTestData方法是保存它创建的客户还是它的克隆都没有区别。不过,在那种情况下,您需要将save方法声明为私有方法,否则您将不知道何时有人从某个地方对其进行调用。在许多情况下,仍然可以克隆以防止将来对代码进行更改而引起不良影响。

相关问题