Почему здесь используется клон?

Я проходил учебник по 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 ответ

Решение

Ваш save Метод общедоступен, поэтому его можно вызывать из любого места. Если кто-то сохраняет клиента, а затем изменяет объект клиента, который он сохранил, вы не хотите, чтобы новые изменения отражались в том, что у вас есть. contacts, Сохранение клона гарантирует, что вы не будете затронуты тем, что они делают.

Но при условии, что метод сохранения не вызывается нигде, кроме ensureTestData()нам все еще нужно его клонировать?

Технически на прицеле нет. Будь твой ensureTestData Метод спасает клиента, которого он создал, или его клон не имеет значения. В этом случае вам нужно будет объявить save Однако метод private, иначе вы не будете знать, когда кто-то вводит вызов из этого источника. Во многих случаях можно было бы клонировать, чтобы предотвратить нежелательные последствия будущих изменений в коде.

Другие вопросы по тегам