2013-02-24 3 views
0

나는과 같이 두 개의 클래스를 인스턴스화하기 위해 노력하고있어 :객체 인스턴스화 순서와 널 포인터 예외는

ball = new Ball(gc, board, player, ai, score);  
ai = new AiPaddle(gc, ball); 

내 문제는 내가 인공 지능을 전달하고 있습니다 때문에 내 볼 클래스는, 널 (null) 포인터 예외를 던지는 유지하는 것이 인 아직 인스턴스화되지 않았습니다.

이러한 객체가 생성되는 순서를 바꾸면 볼 클래스가 필요하기 때문에 대신 내 AiPaddle 클래스가 오류를 던집니다.

이와 같은 문제를 해결하는 가장 좋은 방법은 무엇입니까? 나는 인공 지능 소요 addAi라는 내 볼 클래스에 새로운 방법을 만들어 그것을 해결하는 대신, 그래서 나는이 있습니다

ball = new Ball(gc, board, player, score);  
ai = new AiPaddle(gc, ball);  
ball.addAi(ai); 

을하지만이 할 수있는 더 나은 방법이 확신 해요.

+10

잘못된 디자인으로 인해 발생하는 종속성 문제가 있습니다. 두 클래스의 구조를 다시 생각해보십시오. –

+0

관계의 세부 사항을 살펴보면 클래스를 잘 디자인 할 수 있습니다. 그들에는 "가지고있다"또는 "있는 것"종류의 관계가있을 수 있습니다. 당신이 그 (것)들을 식별하는 경우에 당신은 더 나은 종류를 디자인하고 당신은 어떤 의존 문제든지 확인하고 해결할 수있을 것이다. – ankurtr

답변

1

더 나은 방법은 볼과 에어 패드에 대해 알고있는 세 번째 "마스터"개체가 있어야합니다. 공과 인공 지능을 모두 인스턴스화 한 다음이를 "마스터"에 전달합니다.

0

루카스 크 누스 (Lucas Knuth)가 언급 한 것처럼 설계상의 문제가 있습니다. 찾은 해결책은 좋지만 컨벤션을 잊지 마세요. 볼의 속성을 설정하기 때문에 addAi()가 아니라 setAi() 메서드를 호출해야합니다.

다음에 클래스를 디자인 할 때이 문제를 방지하십시오.