RSS
热门关键字:  java  Ajax  JSP  JSF  Struts
当前位置 : 首页>Java>列表

面向Java开发人员db4o指南:数组和集合

来源: 作者: 时间:2007-10-11 点击:

处理多样性关系

舒适的家庭生活会导致一个或更多 “小人儿” 降临到这个家庭。但是,在增加小孩到家庭中之前,先确保 Person 真正有地方可住。给他们一个工作场所,或者还有一个很好的夏日度假屋。一个 Address 类型应该可以解决所有这三个地方。

 

清单 1. 添加一个 Address 类型到 Person 类中

 

package com.tedneward.model; 

public class Address
{
public Address()
{
}

public Address(String street, String city, String state, String zip)
{
this.street = street; this.city = city; 
this.state = state; this.zip = zip; 
}

public String toString()
{
return "[Address: " + 
"street=" + street + " " +
"city=" + city + " " +
"state=" + state + " " +
"zip=" + zip + "]"; 
}

public int hashCode()
{
return street.hashCode() & city.hashCode() &
state.hashCode() & zip.hashCode(); 
}

public boolean equals(Object obj)
{
if (obj == this)
return this; 

if (obj instanceof Address)
{
Address rhs = (Address)obj; 

return (this.street.equals(rhs.street) &&
this.city.equals(rhs.city) &&
this.state.equals(rhs.state) &&
this.zip.equals(rhs.zip)); 
}
else
return false; 
}

public String getStreet() { return this.street; }
public void setStreet(String value) { this.street = value; }

public String getCity() { return this.city; }
public void setCity(String value) { this.city = value; }

public String getState() { return this.state; }
public void setState(String value) { this.state = value; }

public String getZip() { return this.zip; }
public void setZip(String value) { this.zip = value; }

private String street; 
private String city; 
private String state; 
private String zip; 
}

可以看到,Address 只是一个简单的数据对象。将它添加到 Person 类中意味着 Person 将有一个名为 addresses 的 Address 数组作为字段。第一个地址是家庭住址,第二个是工作地址,第三个(如果不为 null 的话)是度假屋地址。当然,这些都被设置为 protected,以便将来通过方法来封装。

完成这些设置后,现在可以增强 Person 类,使之支持小孩,所以为 Person 定义一个新字段:一个 Person ArrayList,它同样也有一些相关的方法,以便进行适当的封装。

接下来,由于大多数小孩都有父母,还将添加两个字段来表示母亲和父亲,并增加适当的 accessor/mutator 方法。将为 Person 类增加一个新的方法,使之可以创建一个新的 Person,这个方法有一个贴切的名称,即 haveBaby。此外还增加一些业务规则,以支持生小孩的生物学需求,并将这个新的小 Person 添加到为母亲和父亲字段创建的 children ArrayList 中。做完这些之后,再将这个婴儿返回给调用者。

清单 2 显示,新定义的 Person 类可以处理这种多样性关系。

清单 2. 定义为多样性关系的家庭生活

 

package com.tedneward.model; 

import java.util.List; 
import java.util.ArrayList; 
import java.util.Iterator; 

public class Person
{
public Person()
{ }
public Person(String firstName, String lastName, Gender gender, int age, Mood mood)
{
this.firstName = firstName; 
this.lastName = lastName; 
this.gender = gender; 
this.age = age; 
this.mood = mood; 
}

public String getFirstName() { return firstName; }
public void setFirstName(String value) { firstName = value; }

public String getLastName() { return lastName; }
public void setLastName(String value) { lastName = value; }

public Gender getGender() { return gender; }

public int getAge() { return age; }
public void setAge(int value) { age = value; }

public Mood getMood() { return mood; }
public void setMood(Mood value) { mood = value; }

public Person getSpouse() { return spouse; }
public void setSpouse(Person value) { 
// A few business rules
if (spouse != null)
throw new IllegalArgumentException("Already married!"); 

if (value.getSpouse() != null && value.getSpouse() != this)
throw new IllegalArgumentException("Already married!"); 

spouse = value; 

// Highly sexist business rule
if (gender == Gender.FEMALE)
this.setLastName(value.getLastName()); 

// Make marriage reflexive, if it's not already set that way
if (value.getSpouse() != this)
value.setSpouse(this); 
}

public Address getHomeAddress() { return addresses[0]; }
public void setHomeAddress(Address value) { addresses[0] = value; }

public Address getWorkAddress() { return addresses[1]; }
public void setWorkAddress(Address value) { addresses[1] = value; }

public Address getVacationAddress() { return addresses[2]; }
public void setVacationAddress(Address value) { addresses[2] = value; }

public Iterator<Person> getChildren() { return children.iterator(); }
public Person haveBaby(String name, Gender gender) {
// Business rule
if (this.gender.equals(Gender.MALE))
throw new UnsupportedOperationException("Biological impossibility!"); 

// Another highly objectionable business rule
if (getSpouse() == null)
throw new UnsupportedOperationException("Ethical impossibility!"); 

// Welcome to the world, little one!
Person child = new Person(name, this.lastName, gender, 0, Mood.CRANKY); 
// Well, wouldn't YOU be cranky if you'd just been pushed out of
// a nice warm place?!?

// These are your parents... 
child.father = this.getSpouse(); 
child.mother = this; 

// ... and you're their new baby.
// (Everybody say "Awwww....")
children.add(child); 
this.getSpouse().children.add(child); 

return child; 
}

public String toString()
{
return 
"[Person: " +
"firstName = " + firstName + " " +
"lastName = " + lastName + " " +
"gender = " + gender + " " +
"age = " + age + " " + 
"mood = " + mood + " " +
(spouse != null ? "spouse = " + spouse.getFirstName() + " " : "") +
"]"; 
}

public boolean equals(Object rhs)
{
if (rhs == this)
return true; 

if (!(rhs instanceof Person))
return false; 

Person other = (Person)rhs; 
return (this.firstName.equals(other.firstName) &&
this.lastName.equals(other.lastName) &&
this.gender.equals(other.gender) &&
this.age == other.age); 
}

private String firstName; 
private String lastName; 
private Gender gender; 
private int age; 
private Mood mood; 
private Person spouse; 
private Address[] addresses = new Address[3]; 
private List<Person> children = new ArrayList<Person>(); 
private Person mother; 
private Person father; 
}

共4页: 上一页 1 [2] [3] [4] 下一页
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
Google Adsense
相关文章