2013-11-27 142 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

相關問題