如何让java单例对象管理器返回任何类型的对象?
我正在用java从头开始编写一个交互式小说游戏。我目前将所有游戏对象引用存储在名为ObjectManager的单例中的hashmap中。ObjectManager有一个名为get的函数,它接受整数ID并返回适当的引用。问题是,当我需要返回具有更多功能的BaseObject子类时,它会返回一个BaseObject 到目前为止,我所做的是添加了一个getEntity函数,它返回BaseEntity(BaseObject的子类)。但是,当我需要该函数返回到一个对象,该对象是BaseEntity的一个子类,它添加了所需的功能时,我需要生成另一个函数。我知道有更好的方法,但我不知道是什么。我对设计模式知之甚少,也不知道该用哪一种。我试着将“class”作为参数传递,但没有任何效果如何让java单例对象管理器返回任何类型的对象?,java,design-patterns,class,singleton,Java,Design Patterns,Class,Singleton,我正在用java从头开始编写一个交互式小说游戏。我目前将所有游戏对象引用存储在名为ObjectManager的单例中的hashmap中。ObjectManager有一个名为get的函数,它接受整数ID并返回适当的引用。问题是,当我需要返回具有更多功能的BaseObject子类时,它会返回一个BaseObject 到目前为止,我所做的是添加了一个getEntity函数,它返回BaseEntity(BaseObject的子类)。但是,当我需要该函数返回到一个对象,该对象是BaseEntity的一个子
public BaseObject get(int ID){
return (BaseObject)refMap.get(ID);
}
public BaseEntity getEntity(int ID){
return (BaseEntity)refMap.get(ID);
}
谢谢,爪哇忍者 我不鼓励您继续进行此设计 谷歌是;也许这对你来说也是个好主意 听起来您正在尝试做一些Spring的ApplicationContext做得很好的事情。您正在尝试编写一个可配置、灵活的对象工厂。已经完成了。我会研究像Spring和Guice这样的依赖注入引擎。即使你决定不使用它们,也许它们可以提供一些设计灵感
您最好返回一个对象并进行投射。我不鼓励您继续进行此设计 谷歌是;也许这对你来说也是个好主意 听起来您正在尝试做一些Spring的ApplicationContext做得很好的事情。您正在尝试编写一个可配置、灵活的对象工厂。已经完成了。我会研究像Spring和Guice这样的依赖注入引擎。即使你决定不使用它们,也许它们可以提供一些设计灵感
您最好返回一个对象并进行强制转换。如果您有Java 5运行时,请使用通用返回类型:
public <Entity extends BaseEntity> Entity getEntity(int ID){
return (Entity)refMap.get(ID);
}
public实体getEntity(int-ID){
返回(实体)refMap.get(ID);
}
如果您有Java 5运行时,请使用通用返回类型:
public <Entity extends BaseEntity> Entity getEntity(int ID){
return (Entity)refMap.get(ID);
}
public实体getEntity(int-ID){
返回(实体)refMap.get(ID);
}
这两种方法的作用相同;第二种方法可以避免调用方进行强制转换。如果您不想为每个子类创建一个函数,那么答案很简单:不要。调用方必须进行强制转换,但它在功能上与您现在所做的一样好
您可以在泛型中使用相同的方法:
<U> U get(int id, Class<U> clazz) {
return (U) refMap.get(id);
}
U get(int-id,Class-clazz){
return(U)refMap.get(id);
}
但是它并没有为调用方节省太多,因为它只是传递一个类对象,而不是强制转换
如果您不想让调用者完成这项工作,那么您需要编写那些专门的方法。这两种方法做同样的事情;第二种方法可以避免调用方进行强制转换。如果您不想为每个子类创建一个函数,那么答案很简单:不要。调用方必须进行强制转换,但它在功能上与您现在所做的一样好
您可以在泛型中使用相同的方法:
<U> U get(int id, Class<U> clazz) {
return (U) refMap.get(id);
}
U get(int-id,Class-clazz){
return(U)refMap.get(id);
}
但是它并没有为调用方节省太多,因为它只是传递一个类对象,而不是强制转换
<>如果你不想让调用者做这项工作,那么你需要编写那些专门的方法。< /P>这个链接是用于代数和线性方程的C++解析器!我一定会记住这一点,但我刚开始做程序员,所以保持简单是我现在的首要任务。当我完成这个项目时,我会看我是否可以不用单体就可以重做它。这个链接是用于代数和线性方程的C++解析器!我一定会记住这一点,但我刚开始做程序员,所以保持简单是我现在的首要任务。当我完成这个项目时,我会看看我是否可以回去重做它而不需要单例。我知道我需要做一些特殊的转换,但我不知道如何用java来做。伯迈斯特的建议似乎效果不错。我不知道一般的返回类型,我知道我需要做一些特殊的转换,但我不知道如何在java中实现。伯迈斯特的建议似乎效果不错。我不知道一般的返回类型。这种技术非常有效。现在我只需要一个get函数来处理我的所有对象。谢谢这项技术非常有效。现在我只需要一个get函数来处理我的所有对象。谢谢