实现静态“内存”映射

时间:2014-04-03 14:27:05

标签: java map static

我正在编写一个用于测试目的的小应用程序,它接受SOAP调用,为每个调用生成UID,并返回此UID。 UID需要存储在服务器上,所以我想我会使用一个简单的静态地图来存储它们。

我创建了一个新类:

MemoryMap.java

public class MemoryMap {

    static Map<String, String> memoryMap = new ConcurrentHashMap<String, String>();

    static void printMapContents() {
        for (Entry<String, String> pair : memoryMap.entrySet()) {
            System.out.println("Key = [" + pair.getKey() + "]");
            System.out.println("Value = [" + pair.getValue() + "]");
        }
    }
}

然后将其与调用一起使用:

MemoryMap.memoryMap.put(UID, "testString");
MemoryMap.printMapContents();

和...

MemoryMap.memoryMap.remove(parameters.getUID());
MemoryMap.printMapContents();

这很好用,但我不能想到这是否是为此目的实现单个Map的推荐方法。

2 个答案:

答案 0 :(得分:0)

如果您的应用程序必须模拟后端,例如数据库,我建议在某个数据存储区界面中抽象地图,然后为您的应用程序提供由地图支持的此接口实现的单例范围实例。例如:

interface MyDataStore<V>{
  V retrieve(UUID id);
  void remove(UUID id);
}

public final class MockDataStore implements MyDataStore<String>{
  private final static MockDataStore instance = new MockDataStore();
  public static MockDataStore instance(){
    return instance;
  }
  private MockDataStore(){}
  private final ConcurrentHashMap<UUID,String> m = 
    new ConcurrentHashMap<UUID,String>();
  @Override
  String retrieve(UUID id){
    return m.get(id);
  }
  @Override
  void remove(UUID id){
    m.remove(id);
  }
}

然后明天您可以将实现交换为与实际数据库相关的内容。这是ORM系统的非常粗略的近似值。

更好的是,我会立即开始使用数据库。您可以使用内存数据库(如H2),以便在需要时可以将其替换为实际数据库(可能存在一些轻微的迁移问题)。

最后,如果您的存储需求增长,例如,您需要表格和关系,我建议您查看JPA及其中一个实现,例如Hibernate

答案 1 :(得分:-2)

您的服务器接受SOAP请求,很可能这是在多个线程中完成的。 ConcurrentHashMap应该可以正常工作。