问题描述
以下代码是小弟从JForum论坛代码中抽象提取出来的(与JForumExecutionContext相关的)。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);}}public class Test{public static void main(String []args){Person p=Person.getPerson();p.setName("Jack");p.setPerson(p);}}小弟一直迷惑的是Test类中,为什么还要加入p.setPerson(p);这一行代码,个人认为这行代码多此一举。如果必须要有p.setPerson(p);这行代码,原作者为什么要这样写,是不是用了什么设计模式?请高手明示,感激涕零!!!
解决方案
以后再Person p=Person.getPerson(); 这样,取出Person对象,name的值是空的。刚才不知道怎么就提交了。再给出一个单例的写法,个人觉得这样好一些。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;}}
解决方案二:
你给出的那个例子,它没有限制构造方法。还是可以用默认的构造方法创建实例。
解决方案三:
单例模式的一种写法。最后一行是为了保证你的对象变化了。要不然,你p.setName("Jack"); 这一行代码执行过。以后再Person p=Person.getPerson(); 这样,取出Person对