많은 비슷한 질문이 있지만 실현해야 할 곳이없는 것으로 알고 있습니다.Java Generics를 사용하여 객체의 새 인스턴스 만들기 또는 클래스 유형
AbstractSprites
의 참조를 유지하려면 객체 풀 SpritePool
을 사용하고 있습니다. SpritePool의 인스턴스를 만들어서 Sprite
의 형식을 유지해야합니다. Sprite는 AbstractSprite를 확장합니다. 나는 뒤에 오는 것이 중복다는 것을 알고있다, 그러나 이것은 다만 다른 것을 밖으로 시도하고있다. 풀 내에서
SpritePool bulletPool = new SpritePool<GameBullet>(GameBullet.class);
은 (에서는 SpritePool는) 나는 풀을 들고 객체의 새로운 인스턴스를 생성 할 수 있어야합니다. 따라서 위 예제를 사용할 때 bulletPool은 풀 내에 사용할 수있는 현재 GameBullet 객체가 없으면 GameBullet의 새 인스턴스를 생성 할 수 있어야합니다.
다음 코드에서는 클래스 유형의 새 인스턴스를 만들기 위해 리플렉션 (실제로 내가하는 일에 대한 단서가 없음)을 사용하려고했습니다. 나는 내가 원하는 것을하기 위해 아마도 추상적 인 공장을 사용할 수 있다고 읽었지 만, 다시 그렇게하는 방법을 모르겠다. 그것은 어떤 도움이 경우 각 스프라이트 6 개 매개 변수를 사용하면서
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의 생성자는이 개 매개 변수를 사용합니다. 스프라이트의 매개 변수 요구 사항은 변경 될 수 있지만 가능성은 낮아서 객체를 전혀 만들 수 없으면 해결하려고합니다. 도움을 주시면 대단히 감사하겠습니다!
죄송 풀에 전달 여기에 같은 인터페이스를 작성하지만 내가 SpriteFactory를 작성해야 의미 하는가 Sprite의 각기 다른 유형에 대해? – bzach
예. 고전적인 접근 방식입니다. – Nikolay