2016-08-24 3 views
1

그래서 두 개의 거의 동일한 클래스가 있다고 가정 해 보겠습니다.하지만 주요 차이점이있는 객체를 나타냅니다. 현재이 차이점은 실제로 구현되지 않습니다.Java의 instanceof가 기능적으로 동일한 클래스를 구별 할 수 있습니까?

예를 들어, 하나의 클래스는 MorningShiftWorker이고, 다른 메소드와 동일한 메소드 및 동일한 생성자가 있으며, 이는 EveningShiftWorker입니다. 이 두 가지 객체는 수퍼 유형 ShiftWorker의 목록에 저장됩니다.

논리적으로는이 두 그룹을 분리하는 것이 좋지만 혼합 변수에 변수를 추가하는 대신 instanceof을 사용하여 ShiftWorker 목록에있는 개체를 확인하면됩니다.

제 질문은 사과와 오렌지를 구분할만큼 똑똑한가요? instanceof입니까? 이 두 클래스는 현재 모두 이름에서 동일합니다. 그 (것)들에게 말하기 위하여 instanceof를 위해 이젠 그만은, 또는 나가 이것에 관하여 가야하는 다른 방법 있는가? 자바는

+0

간단히 시도해 보지 않으시겠습니까? – Manu

+0

그들은 두 개의 분리 된 클래스 파일에 정의되어 있습니다. 다른 클래스 파일을 상속하지 않으므로 하나는 다른 인스턴스가 아닙니다. – user902383

+0

심각한 모델링 문제가있는 것 같습니다. 도메인 모델이 적절하게 구성되어 있다면'instanceof'를 사용할 필요가 거의 없습니다. – chrylis

답변

3

예, instanceof은 본질적으로 개체가 주어진 클래스로 올바르게 형 변환 될 수 있는지 확인합니다. 우리는 이러한 클래스가 있다고 가정 :

public class Fruit {} 
public class Orange extends Fruit {} 
public class Apple extends Fruit {} 

그런 다음 몇 가지 방법으로 우리가 시도 :이 또한 빈/비 기능 인터페이스 작동

Fruit f = new Apple(); 
boolean isOrange = f instanceof Orange; //False 

합니다.

+0

instanceof를 사용하면 코드 디자인이 좋지 않다고 들었습니다. 내가 공부해야하는 대안적인 접근법이 있습니까? 감사합니다. 나는 단지 그것을 테스트해야했다. 그러나 stressful 한 주이었다. 그리고 나는 공 그러나 아직 오늘 아주 많지 않다! – TheFunk

+0

@ TheFunk는 [방문자 패턴] (http : //www.tutorialspoint.com/design_pattern/visitor_pattern.htm)을 살펴 보았지만 예제에서는 calcPay()가 기본 클래스에서 다르게 구현되었다고합니다. 방문자 또는 instanceof에 대한 필요가 없습니다 귀하의 목록에서 polymorphically 전화 – PSD

+0

@ TheFunk'instanceof'는 본질적으로 나쁜 디자인을 의미하지 않습니다. 프로그래머가'instanceof'를 사용할 수있는 능력을 기반으로 로직을 설계 할 때 나쁜 디자인이 느껴집니다. OOP 패러다임 (예 : 과부하)과 디자인 패턴 (예 : 통역사, 정면)은 "이 참조가 가리키는 대상이 정확히 어떤 종류인지"의 문제를 훨씬 더 깨끗하게 극복 할 수 있습니다. 본질적으로 : 그것을 사용하는 것을 두려워하지 말고, 그것을 사용하기를 기대하지 마십시오. – Zircon

0

예를 instanceof를은 충분히 "스마트"입니다. xxy이 이름을 제외하고 동일한 클래스이더라도 instanceof y인지 여부를 잘 알고 있습니다.

그것은 첫 번째 파라미터, 즉 모든 instanceof Object, Integer, Float 인 그 친구 모든 개체 유형 yx위한 instanceof Number 물론 x instanceof y의이 있으며, 두 번째 파라미터의 상속 계층에 있는지를 확인한다.

3

instanceof 연산자는 클래스의 내용을 비교하지 않는 구조화되지 객체/클래스를 구별하기위한 이름을 사용하기 때문에

+0

"'x instanceof x'"이것은 어떤 x에도 의미가 없습니다. 'x'가 값이면'instanceof'의 오른쪽 일 수 없습니다; 유형이라면 왼쪽에있을 수 없습니다. –

2

잘못된 질문을하고 있습니다. "부러진 디자인을 어떻게 수정해야합니까?"라는 질문을해야합니다.

"거의"동일한 클래스가 있어야하지만 메서드 및 생성자 내에서 "복제 된"코드를 공유하는 경우; 그럼 뭔가를하고있다 틀린.

절대 코드 중복 코드.

그래서 instanceof에 대한 걱정 대신; 뒤로 물러서서 클래스 계층을 다시 디자인하면 결국 공통 일을 구현할 수 있습니다. 그래서 당신의 아침과 저녁 shifters는 "그 다른 측면"만을 포함합니다.

Robert Martin의 "민첩한 원칙"을 확인해보십시오.이 책에는 "지불 시스템"에 대한 실제 사례가 실려 있습니다. 매우 다른 모델에서 돈을받는 직원이있는 곳에서 시스템을 작성하는 방법에 대해 자세히 설명합니다. (인터넷에서 무료로 PDF로 "C#"버전을 찾을 수도 있습니다).

+0

감사합니다. 현재 클래스는 기능적으로 동일하지만 실제로 공통 코드를 포함하지 않습니다. 아래의 @PSD와 이야기하면서 나는 다형성을 상기시켰다. 수퍼 클래스에 추상적 인 메소드를 만들면,이를 내 서브 클래스에서 정의 할 수 있지만 instanceof를 사용하지 않고 수퍼 클래스에서 호출 할 수 있습니다! : D – TheFunk

+0

예, 그렇게해야합니다. – GhostCat

관련 문제