我意识到存在许多类似的问题,但没有一个能够让我在需要的地方完成任务。Java使用泛型或类类型创建对象的新实例
我正在使用对象池SpritePool
来保留对AbstractSprites
的引用。我创建SpritePool的实例,给它应该保留的类型Sprite
。 Sprite扩展AbstractSprite。我知道以下是多余的,但这只是我尝试不同的事情。
SpritePool bulletPool = new SpritePool<GameBullet>(GameBullet.class);
在池(SpritePool)中,我需要能够创建池所持有对象的新实例。因此,在使用上面的示例时,如果池中没有可用的当前GameBullet对象,则bulletPool必须能够创建GameBullet的新实例。
在下面的代码中,我试图使用反射(真的不知道我在做什么)来创建一个Class类型的新实例。我已经读过,我可以使用抽象工厂来做我想做的事,但是我又不确定如何去做。
public class GameSpritePool<T extends AbstractSprite> {
private Class<T> clazz;
public GameSpritePool(Class<T> clazz) {
this.clazz = clazz;
}
/**
* Creates a new instance object of type T. This object can later be borrowed
* from the pool if it is not in use.
*
* @return The object of type T that was created
*/
public AbstractSprite create() {
try {
Class[] args = new Class[6];
args[0] = TransformableContent.class;
args[1] = ResourceFinder.class;
args[2] = float.class;
args[3] = float.class;
args[4] = float.class;
args[5] = float.class;
Constructor constructor = clazz.getConstructor(args);
return (AbstractSprite)constructor.newInstance((object)args);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
如果是任何帮助,AbstractPool的构造函数有两个参数,而每个精灵需要6个参数。雪碧的参数要求可能会改变,但这不太可能,我宁愿为此工作也不能创建对象。 任何帮助,非常感谢!
很抱歉,如果我不太了解,但这是否意味着我必须建立一个SpriteFactory对于每种不同类型的Sprite? – bzach
是的。这是经典的方法。 – Nikolay