2011-06-13 121 views
0

我想修改帐户对象,但这些更改似乎没有出现在原始列表中。也许有人可以指出一个错误。修改克隆的对象

见下面的代码:

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; 
} 
+0

谨慎地正确缩进代码? – aioobe 2011-06-13 14:23:39

+0

如果您发布了'getAccount'和'getCustomer'的内容,它会更有帮助。我怀疑你是在做一个“深层复制”。 – mre 2011-06-13 14:24:47

+0

public Account getAccount(long accountNumber)throws Exception { \t \t boolean found = false; \t \t对(INT I = 0; I trs 2011-06-13 14:29:58

回答

0

在这种情况下,你应该得到的户口本复印件(经getAccount),修改它,然后将它重新插入列表

正如你所说,你正在修改副本。该副本本身没有连接到您的收藏中,因此当您退出范围时您将失去它。

无论是修改副本还是重新插入副本,最佳解决方案都是另一回事。您可能需要进行修改,但这会让您面对各种问题(例如线程 - 如果您在修改帐户的一半,另一个客户端遍历列表并读取帐户详细信息,会发生什么情况?)

0

如果getAccount()返回稍后想要修改的深克隆,则应将其存储在一个变量中。如果你不这样做,每次打电话给getAccount()你都会得到一个新的对象。

1

简单地调用clone()返回一个对象的深层副本。它会返回一个浅拷贝。覆盖克隆是棘手的。按照Joshua Bloch的建议从Effective Java并避免使用clone()赞成复制构造函数。

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

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

而且,为什么不帐户的集合存储在一个地图,这样你就不会需要遍历ň帐户复制之前?你也想仔细阅读Brian的答案。