1

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

Object getValue(String data);

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

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

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 有效地为我保留了缓存。

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

感谢您阅读我的帖子。

4

1 回答 1

0

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

无论如何,从您的文本中,您的对象没有状态,您只是在转换 String 参数而不使用其他数据。鉴于此,我会寻求一种static方法。

于 2012-08-12T15:55:57.250 回答