модификация клонированных объектов - PullRequest
0 голосов
/ 13 июня 2011

Я пытаюсь изменить объекты учетной записи, но изменения, похоже, не появляются в исходном списке после. Возможно, кто-то может определить ошибку.

см. Код ниже:

if(aBank.getAccount(number)!=null){
                        System.out.println("Account information is listed below");
                        System.out.println(aBank.getAccount(number).toString());
                        System.out.println("Modify first name y or n");
                         answer=keyboard.nextLine();
                            if(answer.equals("Y")||answer.equals("y")){
                                System.out.println("Enter first name:");
                                firstName=keyboard.nextLine();
                                aBank.getAccount(number).getCustomer().setFirstName(firstName);

                            }
                        System.out.println("Modify last name y or n");
                        answer=keyboard.nextLine();
                            if(answer.equals("Y")|| answer.equals("y")){
                                System.out.println("Enter last name:");
                                lastName=keyboard.nextLine();
                                aBank.getAccount(number).getCustomer().setLastName(lastName);
                            }

                    }

                else{
                    System.out.println("Account not found");
                }

примечание: getAccount (число) возвращает клон учетной записи, который является глубокой копией, а getCustomer также возвращает клон, который является глубокой копией

Содержимое getAccount

public Account getAccount(long accountNumber ) throws Exception { 
    boolean found=false; 
    for(int i=0;i<accounts.size();i++){ 
        if(accounts.get(i).getAccountNumber().compareTo(accountNumber)==0){ 
            found=true; 
            return accounts.get(i).clone(); 
        } 
    } 
    if (!found){ 
        return null; 
    } 
    return null; 
} 

Ответы [ 3 ]

1 голос
/ 13 июня 2011

Простой вызов clone() приведет к , а не , вернет глубокую копию объекта.Он вернет мелкую копию.Переопределить клон сложно.Следуйте советам Джошуа Блоха из Effective Java и избегайте использования clone() в пользу конструктора копирования.

private Account(Account account) { 
   this.name = account.getName();
   //etc
}

public void createCopy(Account account) { 
    return new Account(account);
}

Кроме того, почему бы не сохранить коллекцию учетных записей на карте, чтобы выне нужно перебирать N аккаунтов перед копированием?Вы также захотите внимательно прочитать ответ Брайана.

0 голосов
/ 13 июня 2011

Если getAccount() возвращает глубокий клон, который вы хотите изменить позже, вы должны сохранить его в переменной. Если вы этого не сделаете, каждый раз, когда вы звоните getAccount(), вы получаете новый объект.

0 голосов
/ 13 июня 2011

В этом сценарии вы должны получить копию учетной записи (через getAccount), изменить ее, а затем вставить ее в список .

Как вы уже заметили, вы изменяете копию. Эта копия сама не зашита в вашу коллекцию, поэтому вы потеряете ее при выходе из области действия.

Является ли изменение копии и ее повторная установка оптимальным решением - это другой вопрос. Вы можете внести изменения на месте, но это оставляет вас открытыми для всех видов проблем (например, многопоточность - что произойдет, если вы на полпути к изменению учетной записи, а другой клиент просматривает список и читает данные учетной записи?)

...