java - 存储一组静态字符串值的最佳方法

标签 java performance collections singleton

我需要从 odata uri 中检索查询参数,例如 clIdclCtxclName,并在整个程序中使用它们许多类(class)。在我们定制的客户端框架中,每次检索查询参数都是一个昂贵的过程。每个请求检索和存储一次参数并在整个程序中使用相同参数的最佳方法是什么?

我的想法是创建一个带有静态 java 映射的单例类,如下所示。我第一次可以检索它们并将其存储在 map 中以便稍后使用。

还想知道我的方法是否存在内存泄漏或缺点等问题。

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;
   }
}

最佳答案

Also Would like to know Is my approach has any issues like memory leak or drawbacks.

1) 您的ClientContainer类仅存储一个客户端的参数。
您使用 Map<String,String> (参数值)在而不是 Map<Client, Map<String, String>> 中(参数值和客户端的所有值)。
由于您可以使用单例模式实例化该类一次,因此您只能存储不超过一个客户端请求的数据。

2)这样请求(param-value)的生命周期将是无限的。
Map实际上永远不会被垃圾收集,因为它被单例实例引用,而该单例实例也永远没有机会被垃圾收集。

因此,如果您保留单例模式,您至少应该考虑 key-values根据客户端的说法,您还应该考虑在每次完全处理请求时清理缓存以避免内存泄漏。

但是如果我是你,我可能会使用另一种解决方案:

  • 我要么一次性将 Map 创建为局部变量:在收到请求时,然后将其显式传递给需要该请求的每个方法。

  • 或者我会使用 ThreadLocal如果每个请求都由特定线程处理,则存储 Map。

请注意,我更喜欢第一种方式,可以清楚地公开方法的依赖关系。
另请注意,使用 Map如果要使用的字段数量稳定且已知,则不一定是最好的事情:使用自定义类可能会更清晰、可读且更健壮。

关于java - 存储一组静态字符串值的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50975893/

相关文章:

java - 扩展类构造函数被调用两次

java - jUnit 使用 File 函数时出现 NullPointerException

mysql - 我应该使用哪种技术来处理每 30 秒 100 万 * 100 万次计算

java - 使用 map 修改对象列表的有效方法

java - 将对象类型转换为任何 Collection 类型

java - Maps数据结构的 map

java - 如何将Java中的Map对象保存到MySQL数据库中

java - 为什么java支持原始数据类型的函数重载?

mysql - 提高大型数据库上 mySQL 查询的速度

Android 远程方法 (AIDL) 与 Intents - 性能和电池使用情况