0

我有一个关于struts的问题。

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

此外,并非每次操作类调用我都可以访问此地图。如果我调用这个动作类 100 次,可能只有 40 次需要访问这张地图。

如果我将此地图加载为

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

有什么缺点?哪个是最好的方法?

4

3 回答 3

2

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

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

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

于 2009-09-11T12:26:35.023 回答
1

您现在对其进行编码的方式 - 每次调用 getMap() 方法时都会重新创建 testMap。我不确定“如果调用了动作类”是什么意思-如果在您的类上调用了 getMap() 方法,那么是的-如果调用了其他方法而不会以某种方式调用 getMap() , 那就不要。

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

如果您将 Map引用设为静态,它将在类级别存在一次。您也可以静态加载地图,这只会发生一次。仅当您不打算更改地图的内容时才应该这样做,因为您可能会遇到线程问题,或者如果地图不断将数据添加到其中但从未删除,则必须处理确定何时清空地图, ETC。

也不是每次动作类调用我都可以访问这个地图。如果我调用这个动作类 100 次只有 40 次,可能需要访问这个地图。

如果您担心您可能永远不需要地图,您可能需要研究延迟加载 - 使地图成为静态引用,但始终通过检查地图是否已创建的静态方法访问它 - 如果没有在第一次需要时而不是在启动时创建。虽然在这种情况下它可能无关紧要。

我必须在动作类中定义这个地图

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

您可以添加一个ServletContextListener来监听您的 Web 应用程序的启动和停止,并通过调用将 Map 添加到 Application 范围

servletContext.setAttribute("mapKey", testMap)  

然后在您的操作中(或您的网络应用程序中的其他任何地方)您可以调用

servletContent.getAttribute("mapKey")

并访问您的地图。

于 2009-09-11T13:35:47.060 回答
0

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

于 2009-09-11T12:21:41.033 回答