多个实例与缓存实例



考虑一个只有一个方法的interface

Object getValue(String data);

假设这描述了从String到任何其他数据类型的数据转换(假设转换有效)。对于来自文本上下文的数据,可能有多个具有相同数据类型的列,因此同一数据转换器将有多个实例。

很久以前,我编写了代码来缓存这些实例,而不是拥有同一对象的多个实例:

private HashMap<Class<? extends T>, T> map;
public synchronized T getInstance(Class<? extends T> type) throws IllegalArgumentException
{
  T instance = map.get(type);
  if (instance == null)
  {
    try
    {
      instance = type.newInstance();
    }
    catch (Exception ex)
    {
      throw new IllegalArgumentException("The provided class cannot be instantiated: "
              + type.getName() + "n" + ex);
    }
    map.put(type, instance);
  }
  return instance;
}

由于这些类没有状态,因此在当时拥有同一类的许多实例似乎是一种浪费,而单个共享实例就可以了。

但是,维护映射可能比拥有同一对象的多个实例(即使可以共享单个实例)的开销更大。我的意思是,即使有多个实例,方法代码也只放在内存中一次,对吗?所以在我看来,JVM实际上是在为我保留缓存。

对此事有什么想法吗?单一实例缓存方法会更好吗?

感谢您阅读我的帖子。

每次使用 new 时,都会创建一个在堆中分配的新对象实例。当然,可执行代码属于类,它只是共享实例。

无论如何,从您的文本来看,您的对象没有状态,您只是使用其他数据转换 String 参数。鉴于此,我会选择一种static方法。

最新更新