如何创建静态';对象持有者';在Java中使用泛型初始化
我试图创建一个简短的对象类。 例如,如何创建静态';对象持有者';在Java中使用泛型初始化,java,generics,Java,Generics,我试图创建一个简短的对象类。 例如, public ResponseAbc bringMeStuff(RequestAbc request){ ResponseAbc response = new ResponseAbc(); /* Setting request here.. */ response = bringMeLotsOfStuff(request); /* Here I am calling the Util class */ Util.putToObjectHolder("myA
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;
}
}
公共类Util{
私有静态Util实例=null;
私人地图objHolder;
私有Util(){
}
/*我强烈认为,如果我想全局保存映射,Util类应该是单例的*/
公共静态Util getInstance(){
if(实例==null){
instance=newutil();
}
返回实例;
}
公共静态void putToObjectHolder(字符串objectName,T objectType){
//映射持有者=(映射)getInstance().getObjHolder();
//holder.put(objectName,objectType);
getInstance().getObjHolder().put(objectName,objectType);//->参数错误
}
公共静态对象getFromObjectHolder(最终字符串objectName){
映射持有者=(映射)getInstance().getObjHolder();
T obj=null;
for(条目:holder.entrySet()){
if(entry.getKey().equals(objectName)){
obj=entry.getValue();
}否则{
obj=null;
}
}
返回obj;
}
公共地图getObjHolder(){
if(objHolder==null){
objhold=newhashmap();
}
返回objHolder;
}
公共void setObjHolder(映射objHolder){
this.objHolder=objHolder;
}
}
如果我取消对putToObjectHolder方法的注释,它会工作,但我不确定它是否应该这样工作。我的意思是创建一个其他地图并分配给它应该可以做到这一点
我想做的是用一个实例保存一个静态映射持有者,这样我就可以用一个名称放置我想要的任何对象,并且只要该对象存在于该“全局持有者”中,就可以随时获取该对象
PS:当然,它的类型安全警告非常混乱,我也想改进它,尽管我不知道如何改进
提前感谢。您使用的不是泛型。看看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"));
}
}
import java.util.HashMap;
公共类Util{
私有静态HashMap值=新HashMap;
私有Util(){
}
公共静态void put(字符串键、对象值){
value.put(键、值);
}
公共静态对象get(字符串键){
返回值.get(key);
}
公共静态void main(字符串[]args){
String s=“这是一个测试。”;
Util.put(“测试”,s);
System.out.println(Util.get(“test”);
System.out.println(Util.get(“另一个测试”);
}
}
抛开单例部分不谈,您是否试图使用泛型在保持类型安全的同时将对象(不同类型的)放入和移出同一映射?也就是说,如果您将一个字符串放入映射(对于给定的键),那么只有将该值分配给(或用作)一个字符串时,才能将该值导出。(此外,代码中没有强制转换。)
这是可以做到的,但有点复杂,因为您需要定义具有相应值类型的键
见:
约书亚·布洛克(Joshua Block)在某个地方也有一篇关于这方面的好文章,但我似乎找不到
这似乎是您试图通过put方法实现的目标。不过,您无法使用字符串作为键,您需要一个通用的、键入的键。感谢您的解释,这对解决我头脑中的主要问题有很大帮助。