Null Objects Singleton

对应一个类成员,如果忘记建立对象,就会抛出NullPointerException,怎么办?

例子:一个公司的全体成员

         1、人(Person)

         2、职位(Position)

         3、公司的全体成员(Staff)

 哪么对于:有的职位可能没人,就是空对象(这是合理的,不是错误)

解决办法:

                现在:1、建立public Person 类(对外)。

                         2、再建立一个类NullPerson(对内),NullPerson类(这是一个类,有自己的方法和地址空间)

                         3、建立空对象(NULL):设置成 Static final 模式,Person 入内存后,成为类常量,一直不变,除非Person 类对象被垃圾收集器弄走了。

                         4、所以空对象:就成为一个Singleton(单个不变的对象)

一、建立人这个类(对外),当人是空时默认建立一个空类(内部)

      Person :也是一个不可修改类,只许第一次时调用者个类时赋值类成员变量。\

      类成员变量都是final String :表示对象级别常量,当建立对象时赋值,这个对象活着时,一直不许修改。只能读                                   

 package ftypeinfo;

import net.mindview.util.Null;

public class Person { 
public final String first;
public final String last;
public final String address;
public Person(String first,String last,String address)
{
this.first=first;
this.last=last;
this.address=address;
}
public String toString(){
 return "Person:"+first+" "+last+" "+address;
}    

static class NullPerson extends Person implements Null
{
   private NullPerson() {
     super("no", "no","no");}
 public String toString() 
  {  return "NullPerson"; }
}
  public static final Person NULL=new NullPerson();//当Person 类入内存后,NULL一直不会变化。
}                       

二、这是一个职位类,对空对象的使用(当一个职位没人,就要用到空对象)

      1、当对Position 使用时,初始化Position 的类成员人对象(Person )全部设置成Person.NULL(即new 一个空类)。

package ftypeinfo;

public class Position {
  private String title;
  private Person person;


public Position(String jobTitle) {

this.title = jobTitle;
person=Person.NULL;//对人类开始使用,哪么人类入内存,并进行类成员初始化,和一些Static初始化。
}
public String getTitle() {
return title;
}
public void setTitle(String newTitle) {
this.title = newTitle;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
    if (person==null)
    person=Person.NULL;
}
public String toString(){
 return "Position:"+title+" "+person;
}
}

三、公司开始整理职位和相应人员的数据,看哪些岗位需要人员,有哪些人,等等

    1、由于要增加许多职位对象,所以首先想到的容器类,没有什么特殊要求,就用ArrayList。

    2、add 方法:就是循环增加Position对象,哪么数据全部进入Position 类对象区。

                       哪么现在这些增加的 Position对象,什么时候释放?看看圾收集器。                     

的 add 的方法。所以ArrayList,直接使用其方法。

     package ftypeinfo;


import java.util.ArrayList;

public class Staff extends ArrayList<Position> {

  public void add(String... titles){

for(String title:titles)
 add(new Position(title));//直接拿 ArrayList 类里面的 add 方法使用。
}

public Staff(String... titles) 
 {
add(titles);
 }

  public boolean positionAvailable(String title)
  {
for(Position position:this)
 if (position.getTitle().equals(title)&&
 position.getPerson()==Person.NULL)  这里对象可以 用 == 号,因为Person.NULL的对象时不变的对象。
   return true;
return false;       
  }

 public void fillPosition(String title,Person hire)
 {  
for(Position position:this)
 if (position.getTitle().equals(title)&&
 position.getPerson()==Person.NULL){
 position.setPerson(hire);
 return;
 }  
 }
public static void main(String[] args) {
// TODO Auto-generated method stub
     Staff staff=new Staff("President","CTO",
      "Marketing Manager","Product Manager",
      "Project Lead","Software Engineer",
       "Software Engineer","Test Engineer",
       "Technical Writer");
     staff.fillPosition("President", new Person("Me","Last","the Top,Lonely At"));
     staff.fillPosition("Project Lead", new Person("Janet","Planner","The Burbs"));
     if (staff.positionAvailable("Software Engineer"))
    staff.fillPosition("Software Engineer", new Person("Bob","Coder","Bright Light City"));  
System.out.print(staff);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值