我正在尝试创建一个简短的对象持有者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:对于类型安全警告肯定是非常混乱,我很乐意改进它,尽管我不知道如何。提前致谢。
答案 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"));
}
}