欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

面向Java程序员的db4o指南: 数组和集合

程序员文章站 2022-05-18 14:26:33
在本文中,介绍 db4o 中结构化对象的存储和操作,并首先介绍多样性关系,在多样性关系中,对象中含有对象集合形式的字段。db4o 可以轻松处理多样性。还将进一步熟悉 db4o 对级联更新和激活深度...

在本文中,介绍 db4o 中结构化对象的存储和操作,并首先介绍多样性关系,在多样性关系中,对象中含有对象集合形式的字段。db4o 可以轻松处理多样性。还将进一步熟悉 db4o 对级联更新和激活深度的处理。

  处理多样性关系

  舒适的家庭生活会导致一个或更多 “小人儿” 降临到这个家庭。但是,在增加小孩到家庭中之前,我想先确保我的 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 its not already set that way
  if (value.getspouse() != this)
   value.setspouse(this);