今天在写代码的时候突然冒出这个奇怪的想法=。=……
先说明一下现在的状况:
我们的b/s系统是jsp的,里面有一种“表码表”,里面存放的是一些需要经常使用而且比较少发生改变的内容,表码表是一些Map对象,而这些表码表会存放在jsp的ServletContext中。
初始化的大致代码如下:
Language: Java
class SysInit extends HttpServlet implements ServletContextListener{ public void contextInitialized(ServletContextEvent sce) { Map myTablePool= new HashMap(); servletContext = sce.getServletContext(); //往myTablePool里面塞数据 ... servletContext.setAttribute("m1",myTablePool); ... } }
然后在需要调用这些表码表的那些BO类中从request的serveletContext中获取,再进行操作:
Language: Java
class MyBO { public MyBO(HttpServletRequest req){ Map myTablePoo l= (Map) req.getSession().getServletContext.getAttribute("m1"); //然后就开始使用myTablePool里面的操作 } }
可是,今天在写BO类的时候突然想起来,这样子的做法和我在BO类里设置一个静态的私有变量有什么区别??
下面是我假想的代码,首先还是我的SysInit类:
Language: Java
class SysInit extends HttpServlet implements ServletContextListener{ public void contextInitialized(ServletContextEvent sce) { servletContext = sce.getServletContext(); MyBO.init();//调用BO类的静态方法,初始化BO里的静态私有变量 ... } }
这是我的BO类:
Language: Java
class MyBO { private static Map myTablePool = null;//我的静态表码表池 public MyBO(){ //先判断一下myTablePool是否为空…… //测试过,除非initPool抛错,没对myTablePool初始化,否则不会为空 if (myTablePool == null){ initPool(); } //直接操作myTablePool里面的数据 } public static initPool(){ myTablePool = new HashMap(); //往myTablePool里面塞数据 ... } }
最早设计这套系统,使用ServletContext的家伙早就跳槽另谋高就,另外找了几个人问,都没有比较令人满意的答复,最多就是说静态变量放在内存里,如果web容器里跑的另外一个应用程序中也有一个同名的静态变量,会发生冲突……
谁能给我一个比较好的解释:类里的静态变量比较好,还是在全局的ServletContext里放着比较好?


