【发布时间】:2018-06-21 19:04:38
【问题描述】:
我需要从 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;
}
}
【问题讨论】:
-
如果您已经知道参数名称并且它们不是动态的,那么使用地图也很昂贵。我想,我宁愿用好的老豆,它又快又干净。此外,根据系统背后的实现,您可能只是用另一个地图替换地图,在这种情况下,建议的方法将是有害的。
-
Victor,我检索到的查询参数不是普通的 Java 映射。要获得带有这些参数的 Java Map,大约需要进行 4 次转换(scala 数据到 Java 数据)。我必须在不同的类中重复此过程 10-11 次。由于这会影响程序的性能,因此我需要一种有效且优化的方法将它们作为一次性步骤存储在程序中的某个位置并以简单的方式获取它们每当我需要它们时。
-
参数有多少?知道提前知道他们的名字吗?如果他们很少而且你认识他们,我会用豆子。
-
在这种情况下,我喜欢你的解决方案,但你想检查你是否映射调用 volatile 并且如果除了 volatile 之外是不可变的和最终的,你会更舒服。考虑到你添加一个客户端密钥也是。
-
感谢维克多的建议。最好使用 bean,因为我的方法有问题,并且可能会导致实时内存泄漏,这更加昂贵。
标签: java performance collections singleton