2013-03-31 18 views
2

3 개의 클래스가 있다고 해봅시다. 수퍼 클래스 인 하나의 클래스와 그 클래스를 상속받은 다른 두 개의 클래스. 내가 수퍼 클래스의 인스턴스를 가지고 있고, 두 개의 서브 클래스 중 어느 것을 알고 싶은지,이 객체는 인스턴스입니다. 두 가지 방법 중 가장 좋은 방법으로 간주됩니다하위 클래스를 결정합니다. 다형성 또는 인스턴스

: 1) instanceof를 또는 모두 getClass()를 사용하고, 비교, 2) 클래스를 나타내는 열거를 얻을 수있는 슈퍼 클래스에 추상 메소드를 선언하고 서브 클래스에 구현합니다.

+3

타입이 필요 하신가요? 가장 좋은 방법은 객체의 실제 유형을 고려할 필요가없는 방식으로 코딩하는 것입니다. 대체 원리에 복종한다고 가정하면 직렬화 나 디버깅과 같은 작업을 수행 할 필요가 거의 없습니다. – Antimony

+0

예를 들어, 일반 항목을 나타내는 추상 클래스 Item이있는 경우 특정 항목이 무엇인지 알 수있는 방법이 있어야하며 이에 따라 특정 작업을 수행하는 것이 좋습니다. –

+0

@ user59559 : 실제로, 그것은 "좋은"것이 아닙니다. 그래서 "말하는 동기"에 대한 답변을 얻고 있습니다. – einpoklum

답변

0

대부분의 경우 다형성이 더 나은 대답입니다. 어떤 서브 클래스를 물어봐야한다면, 새로운 서브 클래스가 추가 될 때 새로운 "if"파트를 그 질문에 추가하는 것을 잊어 버릴 위험이 있습니다.

+1

반면에 열거 형을 사용한다는 것은 새로운 클래스가 추가 될 때이를 업데이트해야한다는 것을 의미합니다. 그리고 슈퍼 클래스가 아마도 결과를 바꾸기 때문에 코드는 어쨌든 업데이트되어야합니다. – Antimony

+0

예, Java enum을 켜면 해당 기술을 사용할 수 있다면 다형성의 많은 이점이 있습니다. –

+0

요점은 둘 다 이상적이지 않다는 것입니다. 가장 좋은 방법은 처음에는 이것을 요구하지 않는 더 나은 디자인을 제시하는 것입니다. – Antimony

-2

일반적으로 가장 좋은 방법은 부울 함수 instanceOf()를 호출하는 것입니다.이 방법은 정상적으로 작동합니다.

나는 두 번째 솔루션을 훨씬 쉽게 사용할 수 있지만 첫 번째 프로그래밍은 좋은 프로그래밍 방법으로 간주됩니다.

+0

instanceof는 연산자가 아니고 함수가 아닙니다. – Antimony

+0

그리고 거의 항상 * 나쁜 * 연습을 나타내는데 좋지 않습니다. –

0

instanceOf를 사용해야합니다. 열거 형 방식을 사용하면 나중에 인스턴스를 확인하고 클래스를 준비해야한다는 것을 손에서 미리 알아야합니다. 그래서 instanceOf를 선호합니다.

1

이 경우 가장 좋은 방법은 polymporphism입니다. 수퍼 클래스에서 추상 메서드를 만듭니다. 서브 클래스는 구체적인 구현을 제공 할 의무가있다. instanceof 또는 getClass가 필요 없습니다.

0

짧은 대답 : 가장 좋은 방법으로 클래스 개체 또는 클래스 이름을 사용하려는 경우 일 수 있습니다. 이를 피함으로써 코드를 더 깔끔하고 쉽게 이해하고 확장 할 수 있습니다.

답변 : 특히 객체 지향 소프트웨어 코드 인 Java를 작성하면 (Subtype) Polymorphism의 원칙이 많이 사용됩니다. 질문의 문맥에서 매우 단순하게하기 : A 클래스의 인스턴스가 B 클래스와 C 클래스로 확장되어있는 경우, A를 "일반"A로만 처리하고 public 메소드를 사용하고 회원; B와 C에 대해 다른 작업을 원할 경우, A와 B에서 C와는 다른 방식으로 구현 된 doSomething() 메소드를 A do에 대해 작성하고 A.doSomething() (A의 기본 구현)을 재정 의하여 구현합니다.

:

이 몇 가지 장점이 있습니다;

(.하지만 A는 추상 클래스이어야 기본 작업이 없다면 @ EvgeniyDorofeev의 answer에서 제안한 것처럼, 당신은 당신의 기본 방법은 추상적 될 수 있습니다)

  • A의 코드는 B와 C에 익숙하지 않아도됩니다.
  • 나중에 다른 클래스 (예 : D 확장 A와 E 확장 C)를 추가하면 기존 코드를 수정할 필요가 없습니다. doSomething).
  • 당신은 ... :-) 클래스 인공 열거 형을 모두 getClass()를 사용하여 또는 만드는 방법에 대해 걱정

필요하지 않습니다하지만 때로는 개체 -의보다 일반적인 비판의 일환으로, 비판 지향적 접근 방식 (예 : The Noun Shuffle, OOP Oversold 참조).

추신 : 때로 getClass() 사용을 피할 수 없습니다 (예 : 클래스 이름이 포함 된 로그 메시지 준비). OP는 그가 직면하고있는 정확한 문제를 구체적으로 밝히지 않았으므로 알기가 어렵습니다. 어쨌든 이 아니라이 클래스에 대한 고유 한 enum을 작성하는 경로로 이동해야합니까? getClass()를 사용하십시오. (정말로 필요하면 클래스 이름을 얻을 수 있습니다). 또한 사용할 수있는 라이브러리가 있으므로 이러한 작업을 처리하므로 클래스를 얻을 필요가 전혀 없습니다 (로깅의 경우 방금 준 예제).

관련 문제