2013-11-27 109 views
0

我意识到存在许多类似的问题,但没有一个能够让我在需要的地方完成任务。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个参数。雪碧的参数要求可能会改变,但这不太可能,我宁愿为此工作也不能创建对象。 任何帮助,非常感谢!

回答

1

您应该使用工厂模式,而不是将具体的sprite类传递给池并进行反射。

喜欢这里创建界面

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

实现它为您的所有对象,并把它传递给你的游泳池

SpritePool bulletPool = new SpritePool<GameBullet>(new GameBulletFactory()); 
+0

很抱歉,如果我不太了解,但这是否意味着我必须建立一个SpriteFactory对于每种不同类型的Sprite? – bzach

+0

是的。这是经典的方法。 – Nikolay

相关问题