2011-06-15 129 views
0

我试图创建代码来更改多个帐户引用的客户对象的名字和姓氏字段。即每个客户可以有更多的那个账户。但是,看起来名称仅针对一个帐户进行了更改,并且更改未显示在连接到同一客户的其他帐户中。也许有人可以指出错误。修改对象的字段

见下面的代码:从主方法

摘录

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

应用licable客户类方法

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

Customer对象如何与Account对象关联?你确定对于每个逻辑客户,你只有一个客户类的一个对象吗? – Olaf 2011-06-15 19:47:28

回答

2

它看起来像你的代码不应该在所有的工作,因为你克隆的客户对象,然后修改克隆。这同样适用于帐户。

一些简化可能有助于调试。大部分代码可以使用标准集合进行简化,而不是迭代和使用compareTo。

这个逻辑也有点奇怪 - 如果任务是修改客户的细节,那么为什么要从一个账号开始,然后去找客户?

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

既然你的帐户的吸气用.clone而且主要是您的客户只获取客户的副本并在那里更改名称。由于字符串是一个不可变的对象,因此您可以替换副本中的名称并仅在此处显示。