2009-09-11 120 views
0

我有一个关于struts的问题。哪种方法最好?

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

此外,并非每次操作类呼叫我都可以访问此地图。如果我将这个动作类别称为100次,则只需要40次即可访问此地图。

如果我加载这个地图是

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

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

回答

0

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

+0

它会被忽略......但我唯一的疑问是如果动作类被调用100次将地图加载一次或100次? – Harish 2009-09-11 12:24:33

+0

@Harish:如果你在一个静态块中初始化地图,当类加载时,地图将被初始化,通常是一次。 – 2009-09-11 13:14:23

2

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

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

如果有时需要改变它,其他因素,如测试和线程,可能导致其他选项是可取的。

1

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

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

如果您使地图参考是静态的,它将在类级别存在一次。您也可以静态加载地图,而这只会发生一次。如果你不打算改变地图的内容,这应该只能做,因为你可能会遇到线程问题,或者必须处理确定何时清空地图,如果它不断地将数据添加到地图中但从未删除等

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

如果你担心你可能永远需要的地图,你可能想看看懒加载 - 制作地图的静态引用,但总是通过,如果地图的创建,检查静态方法访问它但是 - 如果不是,它会在第一次需要时创建,而不是在启动时创建。虽然在这种情况下可能并不重要。

我必须定义一个动作类中该地图

我认为这更多的假设,而不是要求的 - 因为这是一个Web应用程序 - 更好的解决办法可能是把地图在启动时进入应用程序范围 - 几乎就像静态一样,只是它不与一个类绑定。

您可以添加ServletContextListener听你的web应用程序来启动和停止,并通过调用

servletContext.setAttribute("mapKey", testMap) 

然后在动作(在你的web应用程序或其他地方)添加映射到应用范围可以致电

servletContent.getAttribute("mapKey") 

并获得访问您的地图。