Java使用Generics OR Class类型创建新的对象实例

时间:2013-11-27 19:54:17

标签: java generics

我意识到有许多类似的问题,但似乎没有一个能让我到达我需要的地方。

我正在使用对象池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的参数要求可能会改变,但不太可能,我宁愿解决这个问题,也就是根本无法创建对象。 非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

你应该使用Factory模式而不是将具体的sprite类传递给pool并进行反射。

像这里创建界面

public interface SpriteFactory<T extends AbstractSprite> {
  T createSprite();
}

为所有对象实现它并将其传递给您的池

SpritePool bulletPool = new SpritePool<GameBullet>(new GameBulletFactory());
相关问题