研读Spring发布包带的例子petClinic源码之第一部分 POJO

第一部分 POJO
    BascEntity
/**
 * Simple JavaBean domain object with an id property.
 * Used as a base class for objects needing this property.
 *
 * @author Ken Krebs
 * @author Juergen Hoeller
 */
public class BaseEntity {

    private Integer id;
.....................................
(get/set方法略去,下同)
}
该类为实体类对应的POJO的统一父类,提供id属性。因为每个实体都有一个id的属性做为标识,所以这里做为一个父类将id抽象出来。
    NamedEntity
/**
 * Simple JavaBean domain object adds a name property to <code>BaseEntity</code>.
 * Used as a base class for objects needing these properties.
 *
 * @author Ken Krebs
 * @author Juergen Hoeller
 */
public class NamedEntity extends BaseEntity {

    private String name;
    ..................................

}
该类为有名实体对应的POJO的统一父类,提供name属性。比如Pet有名字,同样PetType也有名字,因此又将name抽象到父类。
    Person
/**
 * Simple JavaBean domain object representing an person.
 *
 * @author Ken Krebs
 */
public class Person extends BaseEntity {
    private String firstName;
    private String lastName;
    ....................................
}
人这个实体所对应的POJO,为其子类提供firstName和lastName。比如Pet的所有者Owner和兽医Vet,他们都是人,但是又有自己的属性,为了避免重复代码,抽象成Person类。
    Owner
    /**
     * Simple JavaBean domain object representing an owner.
     * 
     * @author Ken Krebs
     * @author Juergen Hoeller
     */
    public class Owner extends Person {
        private String address;
        private String city;
        private String telephone;
        private Set pets;
    .........................................
//为什么这里的set 方法后面要加上Internal呢?
    protected void setPetsInternal(Set pets) {
        this.pets = pets;
    }
//该方法里面多了一个初始化的工作,主要是为了不让返回结果为null,避免    //NullPointException
    protected Set getPetsInternal() {
        if (this.pets == null) {
            this.pets = new HashSet();
        }
        return this.pets;
    }
/*
为什么要是protected 方法呢?
*/
//该方法把该Owner的宠物通过name排序后返回一个List对象。
    public List getPets() {
        List sortedPets = new ArrayList(getPetsInternal());
        PropertyComparator.sort(sortedPets, new MutableSortDefinition("name", true, true));
        return Collections.unmodifiableList(sortedPets);
    }

    public void addPet(Pet pet) {
        getPetsInternal().add(pet);
        pet.setOwner(this);
    }

    /**
     * Return the Pet with the given name, or null if none found for this Owner.
     * 
     * @param name to test
     * @return true if pet name is already in use
     */
    public Pet getPet(String name) {
        return getPet(name, false);
    }

    /**
     * Return the Pet with the given name, or null if none found for this Owner.
     * 
     * @param name to test
     * @return true if pet name is already in use
     */
    public Pet getPet(String name, boolean ignoreNew) {
        name = name.toLowerCase();
        for (Iterator it = getPetsInternal().iterator(); it.hasNext();) {
            Pet pet = (Pet) it.next();
            if (!ignoreNew || !pet.isNew()) {
                String compName = pet.getName();
                compName = compName.toLowerCase();
                if (compName.equals(name)) {
                    return pet;
                }
            }
        }
        return null;
    }
//这里第二个getPet的方法的ignoreNew不知何用,而且Pet类也没有isNew()这个    //方法。
}
    Vet
/**
 * Simple JavaBean domain object representing a veterinarian.
 *
 * @author Ken Krebs
 * @author Juergen Hoeller
 */
public class Vet extends Person {
private Set<Specialty> specialties;

    protected void setSpecialtiesInternal(Set<Specialty> specialties) {
        this.specialties = specialties;
    }

    protected Set<Specialty> getSpecialtiesInternal() {
        if (this.specialties == null) {
            this.specialties = new HashSet<Specialty>();
        }
        return this.specialties;
    }

    public List getSpecialties() {
        List<Specialty> sortedSpecs = new ArrayList<Specialty>(getSpecialtiesInternal());
        PropertyComparator.sort(sortedSpecs, new MutableSortDefinition("name", true, true));
        return Collections.unmodifiableList(sortedSpecs);
    }

    public int getNrOfSpecialties() {
        return getSpecialtiesInternal().size();
    }

    public void addSpecialty(Specialty specialty) {
        getSpecialtiesInternal().add(specialty);
    }
}
//兽医实体所对应的POJO。首先继承至Person,然后扩展了自己的属性specialties。
    Pet
/**
 * Simple JavaBean business object representing a pet.
 *
 * @author  Ken Krebs
 * @author Juergen Hoeller
 */
public class Pet extends NamedEntity {
    private Date birthDate;
    private PetType type;
    private Owner owner;
    private Set<Visit> visits;
............................................
    protected void setVisitsInternal(Set<Visit> visits) {
        this.visits = visits;
    }

    protected Set<Visit> getVisitsInternal() {
        if (this.visits == null) {
            this.visits = new HashSet<Visit>();
        }
        return this.visits;
    }

    public List<Visit> getVisits() {
        List<Visit> sortedVisits = new ArrayList<Visit>(getVisitsInternal());
        PropertyComparator.sort(sortedVisits, new MutableSortDefinition("date", false, false));
        return Collections.unmodifiableList(sortedVisits);
    }

    public void addVisit(Visit visit) {
        getVisitsInternal().add(visit);
        visit.setPet(this);
    }
}
//宠物所对应的POJO。
    Visit
/**
 * Simple JavaBean domain object representing a visit.
 *
 * @author Ken Krebs
 */
public class Visit extends BaseEntity {
    /** Holds value of property date. */
    private Date date;
    /** Holds value of property description. */
    private String description;
    /** Holds value of property pet. */
    private Pet pet;
    /** Creates a new instance of Visit for the current date */
    public Visit() {
        this.date = new Date();
    }
}
Specialty
/**
 * Models a {@link Vet Vet's} specialty (for example, dentistry).
 * 
 * @author Juergen Hoeller
 */
public class Specialty extends NamedEntity {

}
PetType 
/**
 * @author Juergen Hoeller
 */
public class PetType extends NamedEntity {

}
其实POJO仅仅是简单的JavaBean,这里之所以要从它们开始分析,是因为这个项目中的POJO的设计深合面向对象设计的原理,希望从这些POJO中得出面向对象设计的一些体会,同时也希望在我们实际的项目中能够加以应用。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值