我意識到存在許多類似的問題,但沒有一個能夠讓我在需要的地方完成任務。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