Почему здесь используется клон? - PullRequest
0 голосов
/ 19 февраля 2019

Я проходил урок по 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 голосов
/ 19 февраля 2019

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

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

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

...