对应一个类成员,如果忘记建立对象,就会抛出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);
}
}