我意识到有许多类似的问题,但似乎没有一个能让我到达我需要的地方。
我正在使用对象池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的构造函数需要2个参数,而每个Sprite需要6个参数。 Sprite的参数要求可能会改变,但不太可能,我宁愿解决这个问题,也就是根本无法创建对象。 非常感谢任何帮助!
答案 0 :(得分:1)
你应该使用Factory模式而不是将具体的sprite类传递给pool并进行反射。
像这里创建界面
public interface SpriteFactory<T extends AbstractSprite> {
T createSprite();
}
为所有对象实现它并将其传递给您的池
SpritePool bulletPool = new SpritePool<GameBullet>(new GameBulletFactory());