如何使用Java中的泛型创建静态“对象持有者”类

时间:2013-07-31 17:08:30

标签: java generics

我正在尝试创建一个简短的对象持有者util类。 Forexample;

public ResponseAbc bringMeStuff(RequestAbc request){
ResponseAbc response = new ResponseAbc();
/* Setting request here.. */
response = bringMeLotsOfStuff(request);

/* Here I am calling the Util class */
Util.putToObjectHolder("myAbcResponse", response);
return response;
}

public void testMe(){
/* Testing objectHolder */
ResponseAbc newResponse = (ResponseAbc) Util.getFromObjectHolder("response");
}

这是Util类

public class Util<T> {
private static Util<?> instance = null;
private Map<String, T> objHolder;

private Util() {
}
/* I strongly think Util class should be singleton if I want to hold the map globally */

public static Util<?> getInstance() {
    if (instance == null) {
        instance = new Util();
    }
    return instance;
}

public static <T> void putToObjectHolder(String objectName, T objectType) {
    // Map<String, T> holder = (Map<String, T>) getInstance().getObjHolder();
    // holder.put(objectName, objectType);
    getInstance().getObjHolder().put(objectName, objectType); //-> Argument error
}

public static <T> Object getFromObjectHolder(final String objectName) {
    Map<String, T> holder = (Map<String, T>) getInstance().getObjHolder();
    T obj = null;
    for (Entry<String, T> entry : holder.entrySet()) {
        if (entry.getKey().equals(objectName)) {
            obj = entry.getValue();
        } else {
            obj = null;
        }
    }
    return obj;
}

public Map<String, T> getObjHolder() {
    if (objHolder == null) {
        objHolder = new HashMap<String, T>();
    }
    return objHolder;
}

public void setObjHolder(Map<String, T> objHolder) {
    this.objHolder = objHolder;
}
}

如果我取消注释putToObjectHolder方法,它可以工作,但我不确定它应该以这种方式工作。我的意思是创建一个其他地图并分配给它应该做的伎俩。

我打算做的是拿着一个带有单个实例的静态Map holder,这样我就可以把任何我想要的对象放到一个名字中,并且如果它存在于那个'全局持有者'中,我可以随时获得该对象。

PS:对于类型安全警告肯定是非常混乱,我很乐意改进它,尽管我不知道如何。

提前致谢。

2 个答案:

答案 0 :(得分:1)

将单件部分放在一边,您是否尝试使用泛型将对象(不同类型)放入和取出同一个地图,同时保持类型安全?也就是说,如果你放入地图(对于给定的键)说一个字符串,那么获取该值只会在它被分配给(或用作)字符串时进行编译。 (而且,代码中也没有强制转换。)

这可以完成,但由于您需要定义具有相应值类型的键,因此它有点涉及。

请参阅:Java map with values limited by key's type parameter

Joshua Block在这个地方也有一篇很好的文章,但我似乎无法找到它。

这似乎是您尝试使用put方法实现的目标。但是你不能用字符串作为键来做 - 你需要一个通用的键入键。

答案 1 :(得分:0)

您没有使用通用的方式。看看ArrayList类,了解泛型的真正潜力。

此类的单例也没有用处,因为你只需要一个HashMap的“单例”。

也许我看不到你想要完成什么,但这基本上就是你想要做的。你为什么不只使用HashMap并完成它?

import java.util.HashMap;

public class Util {

    private static HashMap<String, Object> values = new HashMap<String, Object>;        

    private Util() {
    }

    public static void put(String key, Object value) {
        values.put(key, value);
    }

    public static Object get(String key) {
        return values.get(key);
    }

    public static void main(String[] args) {
        String s = "This is a test.";
        Util.put("test", s);
        System.out.println(Util.get("test"));
        System.out.println(Util.get("another test"));
    }
}