哪种方法最好?

时间:2009-09-11 12:14:33

标签: java static map struts action

我对struts有疑问。

我有HashMap,有近50个条目。现在我必须在一个动作类中定义这个地图,比如TestAction。如您所知,此操作类扩展了Action类。现在我的疑问是基本的:我应该将地图加载为静态吗?加载这个Map静态有什么好处?如果我要调用此Action类100次,这个地图只会加载一次吗?

此外,不是每次动作类调用我都可以访问此地图。如果我将此动作类调用100次,则可能只需要访问该地图40次。

如果我将此地图加载为

public Map getMap()
{
 Map testMap= new HashMap();
 testMap.put("Harish",25);
 testMap.put("Ravi",55);
 return testMap();
}

有什么缺点?哪种方法最好?

3 个答案:

答案 0 :(得分:2)

如果您的数据永远不会改变,静态加载它似乎是最好的选择。它只会加载一次。

      private static final Map testMap = new HashMap();
      static {
        testMap.put("Harish",25);
        testMap.put("Ravi",55);
      }

如果您有时需要更改它,其他因素(如测试和线程)可能会导致其他选项更为可取。

答案 1 :(得分:1)

现在编码的方式 - 每次调用getMap()方法时都会重新创建testMap。我不确定你的意思是“如果动作类被调用” - 如果在你的类上调用了getMap()方法,那么是 - 如果调用了某些其他方法而不以某种方式调用getMap() ,然后没有。

  

我应该将地图加载为静态吗?加载这个Map静态有什么好处?如果我要调用此Action类100次,这个地图只会加载一次?

如果您将Map 引用设为静态,则它将在类级别存在一次。您也可以静态加载Map,这只会发生一次。这应该只是在你不打算改变地图内容时才会这样做,因为你可能会遇到线程问题,或者如果不断地将数据添加到地图但是从未删除过,那么必须解决何时清空地图的问题。等等。

  

也不是每次动作类调用我都可以访问此地图。如果我将此动作类调用100次仅40次,则可能需要访问此地图。

如果您担心自己可能永远不需要Map,您可能需要查看延迟加载 - 使地图成为静态引用,但始终通过静态方法访问它,以检查Map是否已创建 - 以及如果不是它第一次需要而不是在启动时创建。虽然在这种情况下它可能并不重要。

  

我必须在动作类

中定义这个地图

我认为这更像是一个假设而不是一个要求 - 因为这是一个Web应用程序 - 更好的解决方案可能是在启动时将Map放入应用程序范围 - 几乎就像静态一样,只是它不依赖于类

您可以添加ServletContextListener来监听您的网络应用的启动和停止,并通过调用

将地图添加到应用范围
servletContext.setAttribute("mapKey", testMap)  

然后在您的操作中(或您的webapp中的任何其他位置),您可以致电

servletContent.getAttribute("mapKey")

然后访问您的地图。

答案 2 :(得分:0)

如果地图的内容保持静态,请将其设置为静态 - 50个条目是少量数据,对类加载时间的影响可以忽略不计。