2010-01-23 3 views
5

다른 클래스 인스턴스의 일부 정보없이 인스턴스를 만드는 것이 이해가되지 않는 곳에 Explosion이라는 클래스가 있다고 가정 해 보겠습니다. 생성자는 공개되지 않습니다.Java의 다른 객체 상태를 기반으로 객체 만들기

은 더 나은이 방법을 수행하는 것입니다 :

// both classes are in the same package 
Explosion e; 
Collision c = new Collision()  
// do some stuff with collision 
e = c.createExplosion() 

을 또는 인스턴스를 생성하는 정적 메소드를 가지고 더 나은 폭발을 그리고 당신은 인수로 충돌 객체를 전달 :

Explosion e 
Collision c = new Collision()  
// do some stuff with collision 
e = Explosion.createExplosion(c) 

두 클래스의 작성자 인 경우.

+0

간편한 단위 테스트를 위해 설계 할 때 가장 좋아하는 솔루션으로 끝납니다. 정적 메소드와 'new'연산자는 특정 클래스를 지적하고 모의 구현을 어렵게 만듭니다. – Christian

답변

1

저는 두 번째를 선호합니다. 왜냐하면 그것은 OO입니다.

4

왜 생성자가 공개되지 않습니까? Explosion이 Collision 참조를 매개 변수로 사용하는 생성자를 갖는 것은 나에게 합리적인 것처럼 보입니다. 당신이 할 수

그 방법 : 더 나은 클래스 사이의 책임을 분할로

Explosion e; 
Collision c = new Collision(); 
// do some stuff with collision 
e = new Explosion(c); 
3

나는 두 번째 방법을 선호합니다. 자신의 질문에 대답하려면 폭발물을 만들 책임이있는 사람에게 자신에게 물어보고 그에 따라 행동하십시오. 두 번째 접근법은 기본적으로 생성자를 숨기기 위해 factory 메소드를 사용하지만, 책임은 여전히 ​​IMO 인 Explosion 클래스 내에 있습니다.

왜 생성자가 공개되지 않습니까? 패키지를 보이게 한 다음 Collision을 생성자 매개 변수로 전달할 수 있습니까?

3

의존성에 크게 좌우됩니다.

항상 Explosion을 하위 레벨 또는 Collision의 피어라고 생각하면 (가상) 인스턴스 메소드의 유연성과 사용 편의성을 고려하십시오. 이것은 객체에서 동작을 유지하고 게터 (디자인이 좋지 않음을 나타내는 경향이 있음)의 필요성을 줄입니다. 여전히 Explosion 생성자에 대한 호출이 있으며, 현재는 Collision 내에 있습니다.

CollisionExplosion에 의존하지 말고 직접 생성자로 이동하십시오. 이것은 가상 메소드의 끝이 아닙니다. 일이 더 복잡해지면 에 전달 된 Explosion의 특정 구성을 만드는 다른 객체에서 가상 메소드를 호출하도록 호출 코드를 변경할 수 있습니다.

1

정말 시스템 범위에 따라 다릅니다. "전체 스트레치"를 실제로 가고 싶다면 시스템의 상호 작용에 "물리학"을 나타내는 세 번째 클래스에서 처리해야합니다.

이유는 다음과 같습니다. 먼저 충돌은 많은 결과를 가져올 수 있습니다 : 폭발, 손상, 득점 (이 게임입니까?)? 소리 등. 당신은 모든 것을 충돌에 과부하하고 싶지 않습니다.

한편 폭발은 여러 가지 이유로 (예 : 무기) 폭발을 일으킬 수있는 모든 것을 알면 폭발이 일어날 수 있습니까?

"세계"의 많은면을 모델링하는 경우 이러한 인과 관계를 담당하는 세 번째 시스템을 원할 수 있습니다.그것은 한 객체의 상태에 대해 필요한 것을 취하고 서로에 대해 알 필요없이 필요한 상태로 다른 객체를 만듭니다.

1
  • Effective Java (2nd chapter)은 두 번째 옵션 인 정적 팩터 리 방법을 사용하는 것이 좋습니다.
  • 당신이 폭발에 필요한 Collision의 매개 변수에 따라,이 때문에 두 번째 방법으로 Law of Demeter
1

장점을 위반하지 만 매개 변수를 전달하는 것이 더있을 수 있습니다하면 폭발 개체를 만들 필요가 있다는 것입니다 때마다 (Effective Java 참조). 어떤 종류의 캐싱 메커니즘을 원한다면 (예 : Collision 클래스의 일부 특성을 기반으로 동일한 폭발 인스턴스를 반환하려는 경우) 두 번째 방법이 유용합니다.

플립 측면에서 Explosion 클래스가 인스턴스 생성을위한 정적 팩토리 메소드 만 제공하는 경우 서브 클래 싱 할 수 없습니다.