多个实例与缓存实例

时间:2012-08-12 15:37:30

标签: java optimization

考虑只有一种方法的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实际上为我保留了一个缓存。

有关此事的任何想法?单例实例缓存方法可以更好吗?

感谢您阅读我的帖子。

1 个答案:

答案 0 :(得分:0)

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

无论如何,从您的文本开始,您的对象没有状态,您只是在不使用其他数据的情况下转换String参数。鉴于此,我会选择static方法。