为什么在这里使用克隆?

湿婆:

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

Ole VV:

您的save方法是公开的,因此可以在任何地方调用。如果某人保存了一个客户,后来又更改了他们保存的客户对象,那么您不希望新的更改反映在您所拥有的内容中contacts将副本保存在此处可确保您不受其行为的影响。

但是,假设没有从其他地方调用save方法ensureTestData(),是否还需要克隆它?

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Linux

为什么在这里使用进程替换导致挂起?

来自分类Java

为什么使用原子在这里?

来自分类Mysql

为什么我在这里通过使用组?

来自分类Linux

为什么在这里获得SIGABRT?

来自分类Java

为什么在这里使用按位与?

来自分类Dev

为什么在这里发生僵局

来自分类Dev

为什么在这里需要分号?

来自分类Dev

为什么在这里使用锁?

来自分类Dev

为什么在这里必须使用括号?

来自分类Dev

为什么在这里使用force_encoding(“ BINARY”)?

来自分类Dev

为什么在这里不确定?

来自分类Dev

为什么在这里的盒子?

来自分类Dev

为什么在这里需要锁?

来自分类Dev

为什么在这里需要静态?

来自分类Dev

Django:为什么是自我。在这里使用?

来自分类Dev

为什么perldoc在这里失败?

来自分类Dev

为什么在这里使用指数枚举键?

来自分类Dev

他们为什么在这里使用.first?

来自分类Dev

为什么在这里不能使用IF?

来自分类Dev

为什么在这里需要'break;'?

来自分类Dev

为什么在这里使用git裸仓库?

来自分类Dev

为什么在这里使用额外的let语句?

来自分类Dev

为什么WlanOpenHandle()在这里失败?

来自分类Dev

为什么在这里使用克隆关键字

来自分类Dev

为什么在这里抛出异常?

来自分类Dev

为什么在这里得到NullPointerException?

来自分类Dev

Javascript:为什么在这里使用 preventDefault?

来自分类Dev

为什么不会 for ... 在这里循环?

来自分类Dev

为什么python在这里运行?