我需要从odata uri中检索查询参数,例如说 clId , clCtx 和 clName ,并在整个程序中使用它们很多班。在我们的自定义客户端框架中,每次检索查询参数都是一个昂贵的过程。每个请求一次检索和存储参数并在整个程序中使用它们的最佳方法是什么?
我的想法是使用静态Java映射创建一个单例类,如下所示。我第一次可以将它们检索并存储在地图中,以便以后使用。
还想知道我的方法是否存在内存泄漏或缺陷之类的问题。
public class ClientContainer {
private static Map<String,String> clientMap;
private static ClientContainer instance;
private ClientContainer(){}
public static ClientContainer getInstance(){
if(instance == null){
instance = new ClientContainer();
}
return instance;
}
private void updateClientMap(HashMap<String,String> clientMap){
if(this.clientMap==null){
this.clientMap =clientMap;
}
}
private HashMap<String,String> getClientMap(){
return this.clientMap;
}
}
答案 0 :(得分:2)
也想知道我的方法是否有内存泄漏之类的问题 或缺点。
1)您的ClientContainer
类仅存储一个客户端的参数。
您在其中使用Map<String,String>
(按参数值),而不使用Map<Client, Map<String, String>>
(按参数值,以及客户所有值)。
因为您可以使用单例模式实例化类的一次,所以您被困在存储数据的次数不超过一个客户请求的情况下。
2)这样,请求的寿命(参数值)将是无限的。
实际上,Map
永远不会被垃圾回收,因为单例实例也没有机会对其进行垃圾回收。
因此,如果您保留单例模式,则至少应根据客户端来考虑key-values
,并且还应该考虑在每次处理完请求后都清理高速缓存,以避免内存泄漏。
但是如果我是你,我可能会使用其他解决方案:
要么我一次将Map创建为局部变量:当我收到请求时,然后将其显式传递给需要此方法的每个方法。
或者如果每个请求都由特定线程处理,我将使用ThreadLocal来存储Map。
请注意,我更喜欢采用第一种方法来清楚地揭示方法的依赖性。
还要注意,如果要使用的字段数稳定且已知,则使用Map
并不是最好的选择:使用自定义类可能更清晰,易读且更可靠。
答案 1 :(得分:0)
如果在多线程环境中使用ClientContainer类,则使getInstance()方法具有线程安全性是有意义的,以避免重复构造函数。为了避免内存泄漏,您可以使用WeakHashMap而不是HashMap。