2011-06-13 124 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的答案。