2014-12-20 1 views
2

내가 그것을 확장 게임 오브젝트와 세 개의 클래스로 알려진 추상 클래스를 게임을 코딩해야하고 (플레이어, 벽, 그리고 적).자바 ArrayList의 효율성

내 게임의 모든 개체가 포함되어있는 것으로 정의 된 목록이 있습니다. 당신이 볼 수있는

public void update() { 
    for(GameObject o : objects) { 
     if(o instanceof Wall) { 
      // do something 
     } 
     else if(o instanceof Player) { 
      // do something 
     } 

     else if(o instanceof Enemy) { 
      // do something 
     } 
    } 
} 

그래서, 전체 목록 확인을 통과해야 :

List<GameObject> objects; 

내가 개체에 뭔가를 할 필요가

, 이것은 내가 어떻게 할 것입니다 단일 객체를 찾기 위해 찾을 수있는 유형. 이것은 나에게 매우 효율적이지 않은 것 같다. 그래서 나는 다른 파생 된 클래스를 자신의 목록에 저장하는 것에 대해 생각했습니다.

private List<Wall> walls; 
private List<Enemy> enemies; 
private Player player; // only one 

이 아니라 전체 목록을가는 모든 것을 포함하고 거세한 숫양을 결정하는 입력 나 뭔가를하지 검사를보다 더 효율적으로 될 것인가? 정말 고마워.

+1

하나 이상의 목록이 중요하지 않습니다. 당신이해야 할 일은 각 객체에 식별자를 할당하고 쉬운 검색을 위해'Map' 구현에 저장하는 것입니다. – asgs

+1

'doSomething()'메소드를'GameObject' (아마도'abstract')에 넣는 것이 좋습니다. 그러면'o.doSomething()'을 호출하고 인스턴스가 그 것을 결정하게 할 수 있습니다. 아니면'update()'일까요? –

답변

6

정상적인 방법은 GameObject에서 인터페이스를 사용하는 것입니다.

public interface GameObject { 
    void update(); 
} 

그런 다음 각 개체에 GameObject를 구현하십시오.

public class Player implements GameObject { 
    public void update() { // update player... 
} 

public class Wall implements GameObject { 
    public void update() { // probably do nothing... 
} 

public class Enemy implements GameObject { 
    public void update() { // update enemy... 
} 

그러면 업데이트 루프는 다음과 같습니다.

public void update() { 
    for(GameObject o : objects) { 
     o.update(); 
    } 
} 

이 속도가 빠르다고 보장 할 수는 없지만 그럴 가능성은 있습니다. 컴파일러는 이와 같은 가상 호출을 최적화 할 수 있습니다 (객체 지향 프로그래밍에서는 가상 호출이 일반적이므로 컴파일러가 최적화 방법을 알기는 정말 좋습니다). 반면에 그것이 가능할 것이라고는 생각하지 않습니다 거의 비슷하게 인스턴스 클래스 유형의 명시적인 확인을 최적화합니다.

+0

감사. 좋은 대답. –