如下Java代码,小弟看不明白,请高手明示。

以下代码是小弟从JForum论坛代码中抽象提取出来的(与JForumExecutionContext相关的)。
[code="java"]
public class Person{
private string name;

private static HashMap<String,Person> hm=new HashMap<String ,Person>();

public void setName(String name){this.name=name;}

public static Person getPerson(){
    Person p=hm.get("p1");
    if(p==null){
        p=new Person();
        hm.put("p1",p);
    }
    return p;
}
public static void setPerson(Person p){hm.put("p1",p);}

}
[/code]
[code="java"]
public class Test{
public static void main(String []args){
Person p=Person.getPerson();
p.setName("Jack");
p.setPerson(p);
}
}
[/code]

小弟一直迷惑的是Test类中,为什么还要加入p.setPerson(p);这一行代码,个人认为这行代码多此一举。如果必须要有p.setPerson(p);这行代码,原作者为什么要这样写,是不是用了什么设计模式?请高手明示,感激涕零!!! :D

以后再Person p=Person.getPerson(); 这样,取出Person对象,name的值是空的。

刚才不知道怎么就提交了。

再给出一个单例的写法,个人觉得这样好一些。

[code="java"]public class Person {
private String name;
private static Person _instance = null;

public void setName(String name) {
    this.name = name;
}

private Person() {
}

public static Person getPerson() {
    if (_instance == null) {
        _instance = new Person();
    }
    return _instance;
}

}[/code]

单例模式的一种写法。最后一行是为了保证你的对象变化了。
要不然,你p.setName("Jack"); 这一行代码执行过。

以后再Person p=Person.getPerson(); 这样,取出Person对

你给出的那个例子,它没有限制构造方法。
还是可以用默认的构造方法创建实例。