Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让java单例对象管理器返回任何类型的对象?_Java_Design Patterns_Class_Singleton - Fatal编程技术网

如何让java单例对象管理器返回任何类型的对象?

如何让java单例对象管理器返回任何类型的对象?,java,design-patterns,class,singleton,Java,Design Patterns,Class,Singleton,我正在用java从头开始编写一个交互式小说游戏。我目前将所有游戏对象引用存储在名为ObjectManager的单例中的hashmap中。ObjectManager有一个名为get的函数,它接受整数ID并返回适当的引用。问题是,当我需要返回具有更多功能的BaseObject子类时,它会返回一个BaseObject 到目前为止,我所做的是添加了一个getEntity函数,它返回BaseEntity(BaseObject的子类)。但是,当我需要该函数返回到一个对象,该对象是BaseEntity的一个子

我正在用java从头开始编写一个交互式小说游戏。我目前将所有游戏对象引用存储在名为ObjectManager的单例中的hashmap中。ObjectManager有一个名为get的函数,它接受整数ID并返回适当的引用。问题是,当我需要返回具有更多功能的BaseObject子类时,它会返回一个BaseObject

到目前为止,我所做的是添加了一个getEntity函数,它返回BaseEntity(BaseObject的子类)。但是,当我需要该函数返回到一个对象,该对象是BaseEntity的一个子类,它添加了所需的功能时,我需要生成另一个函数。我知道有更好的方法,但我不知道是什么。我对设计模式知之甚少,也不知道该用哪一种。我试着将“class”作为参数传递,但没有任何效果

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函数来处理我的所有对象。谢谢