修改对象的字段
问题描述:
我试图创建代码来更改多个帐户引用的客户对象的名字和姓氏字段。即每个客户可以有更多的那个账户。但是,看起来名称仅针对一个帐户进行了更改,并且更改未显示在连接到同一客户的其他帐户中。也许有人可以指出错误。修改对象的字段
见下面的代码:从主方法
摘录
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;
}
答
它看起来像你的代码不应该在所有的工作,因为你克隆的客户对象,然后修改克隆。这同样适用于帐户。
一些简化可能有助于调试。大部分代码可以使用标准集合进行简化,而不是迭代和使用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>
答
既然你的帐户的吸气用.clone而且主要是您的客户只获取客户的副本并在那里更改名称。由于字符串是一个不可变的对象,因此您可以替换副本中的名称并仅在此处显示。
Customer对象如何与Account对象关联?你确定对于每个逻辑客户,你只有一个客户类的一个对象吗? – Olaf 2011-06-15 19:47:28