2013-11-27 2 views
0

많은 비슷한 질문이 있지만 실현해야 할 곳이없는 것으로 알고 있습니다.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의 생성자는이 개 매개 변수를 사용합니다. 스프라이트의 매개 변수 요구 사항은 변경 될 수 있지만 가능성은 낮아서 객체를 전혀 만들 수 없으면 해결하려고합니다. 도움을 주시면 대단히 감사하겠습니다!

답변

1

콘크리트 스프라이트 클래스를 풀링하고 리플렉션을 수행하는 대신 공장 패턴을 사용해야합니다.

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

의 모든 개체에 대해 그것을 구현 내가 아주 이해하지 않는 경우

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

죄송 풀에 전달 여기에 같은 인터페이스를 작성하지만 내가 SpriteFactory를 작성해야 의미 하는가 Sprite의 각기 다른 유형에 대해? – bzach

+0

예. 고전적인 접근 방식입니다. – Nikolay

관련 문제