import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;public class DBRoute implements Serializable { private static final long serialVersionUID = 7257554050781719469L;
private String xid = null;

private DBRoute(String xid) {
this.xid = xid;
} private static Map<String, DBRoute> routes = new HashMap<String, DBRoute>(); public static DBRoute getRoute(String xid) {
return create(xid);
}
public static DBRoute create(String xid) {
if (routes.get(xid) == null) {
// 这里有点晕...routes放进一个新的DBRoute 
// 能在本类的函数中放入一个本类的实例化?是不是因为是static函数?
// 而这个map的值又是个BDRoute 说到底这个DBRoute到底储存了什么东西?
routes.put(xid, new DBRoute(xid));
}
return routes.get(xid);
} public String getXid() {
return xid;
} public void setXid(String xid) {
this.xid = xid;
}

}

解决方案 »

  1.   

    放置实例根他是不是静态的没关系
    只是静态方法中不能用this
      

  2.   

    带初始状态的DBRoute对象都可以有指向自身实例的成员变量,如单例,方法中再对自身类型实例操作更无不可对象本身再包含一个本身,这在客观世界中可能不合逻辑,但程序世界中不受此约束
      

  3.   

    1.无谓有多少个DBRoute,routes只有一个。
    2.DBRoute是不能被new 的,只能通过DBRoute.getRoute()获得
    3.所有新建的DBRoute,都存在routes中。
    4.所有static的东西都存在DBRoute的Class对象中,一个虚拟机只有一份。
    5.DBRoute的Class对象存routes,routes存全部DBRoute对象的引用,通过xid获取对应的DBRoute
    6.if (routes.get(xid) == null)这句是如果routes里没有对应的DBRoute则新建一个不知道你懂了没有~~
      

  4.   

    这个貌似有点像设计模式当中的工厂方法,个人理解他是根据xid才创建对象,而本类不允许其他类对其进行实例化,只是向其他类提供了一个create(String xid) 方法接口,而这个方法的实现会根据xid来判断,是否已存在DBRoute,如果存在,就不进行实例化,直接从map容器里面放回,不存在就实例化一个,然后返回,
    这个设计避免了内存的浪费。还觉得应该把public static DBRoute getRoute(String xid) {
            return create(xid);
        }
    这个方法删除掉。对外面只提供create接口方法!!
      

  5.   

    我觉得这么设计,这个类的对象只是根据xid 来创建。同意5L的说话
      

  6.   

    其实LZ说的很对,对于这个类来说DBRoute确实存不了什么,也干不了什么。
      

  7.   

    我感觉就是个工厂模式,创建不用xid的DBRoute实例..  
    而routes这个静态的集合,就当做是永久保存内存中的集合
    其实放在另外一个类中都可以。