0

我正在尝试创建一个简短的对象持有者实用程序类。例如;

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 持有者,这样我就可以将我想要的任何对象与一个名称放在一起,如果它存在于那个“全局持有者”中,我可以随时获取该对象。

PS:类型安全警告肯定很混乱,我也很想改进它,尽管我不知道该怎么做。

提前致谢。

4

2 回答 2

1

撇开单例部分不谈,您是否尝试使用泛型将(不同类型的)对象进出同一个 Map 同时保持类型安全?也就是说,如果你在映射中(对于给定的键)说一个字符串,那么只有当它被分配给(或用作)字符串时才能编译出这个值。(而且,代码中也没有强制转换。)

这可以完成,但它有点复杂,因为您需要定义具有相应值类型的键。

请参阅:Java 映射,其值受键的类型参数限制

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

这似乎是您尝试使用 put 方法实现的目标。但是,您将无法使用字符串作为键来执行此操作-您需要一个通用的键入键。

于 2013-07-31T17:46:04.697 回答
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"));
    }
}
于 2013-07-31T17:26:03.167 回答