изменение полей объекта - PullRequest
0 голосов
/ 15 июня 2011

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

см. Код ниже:

выдержка из основного метода

System.out.println("Enter the number of the account that you would like to modify:");
            number=keyboard.nextLong();
            keyboard.nextLine();
            firstName=null;
            lastName=null;

            try{
                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();


                            }
                        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.changeName(number,firstName,lastName);

                    }

                else{
                    System.out.println("Account not found");
                }
            }
            catch(Exception e){
                System.out.println("Unable to process request.\n" + e.getMessage());
            }

применимые методы класса банка:

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();
        }



        }

public void changeName(Long accountNumber, String firstName, String lastName) throws Exception{


    if (getAccount(accountNumber)!=null){
        accounts.get(accounts.indexOf(getAccount(accountNumber))).getCustomer().modifyName(firstName, lastName);
    }
    else{
        throw new Exception("Account not found");

    }

применимые методы класса счета

private Account (Account a){
    //copy constructor
    this.accountNumber=a.accountNumber;
    this.startBalance=a.startBalance;
    this.customer=a.customer;
    this.trans=a.trans;

}


public Customer getCustomer() {

    return this.customer.clone();

}
public void modifyName(String firstName, String lastName){
    if(firstName!=null){
        customer.setFirstName(firstName);
    }

    if(lastName!=null){
        customer.setLastName(lastName);
    }
}

применимые методы класса клиента

private Customer(Customer c){
    //copy constructor
    this.customerNumber=c.customerNumber;
    this.socialSecurityNo=c.socialSecurityNo;
    this.firstName=c.firstName;
    this.lastName=c.lastName;
}

Ответы [ 2 ]

2 голосов
/ 15 июня 2011

Похоже, ваш код вообще не должен работать, потому что вы клонируете объект Customer, а затем модифицируете клон. То же самое касается счетов.

Некоторое упрощение может помочь с отладкой. Большая часть этого кода, вероятно, может быть упрощена с помощью стандартных коллекций, а не с помощью итераций и с помощью сравнения.

Логика также немного странная - если задача состоит в том, чтобы изменить данные клиента, то зачем начинать с номера счета, а затем переходить к клиенту?

if (getAccount(accountNumber)!=null){
        accounts.get(accounts.indexOf(getAccount(accountNumber))).getCustomer().modifyName(firstName, lastName);
    }
    else{
        throw new Exception("Account not found");
    }

можно упростить до чего-то вроде:

getAccount(accountNumber).getCustomer().setName(firstName, lastName);

если getAccount и getCustomer вызвали исключение, если элемент не был найден.

Метод getAccount может быть уменьшен до чего-то вроде:

public Account getAccount(long accountNumber )  {
        return accounts.get(accountNumber )
    }

(едва ли стоит иметь метод для!), Если учетные записи были Map<Long,Account>

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

Поскольку вы используете .clone в получателе учетной записи и, главным образом, в качестве клиента, вы получаете только копию клиента и меняете там имена.Поскольку String является неизменным объектом, вы заменяете имена в копии и только там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...