짧은 대답 : 가장 좋은 방법으로 클래스 개체 또는 클래스 이름을 사용하려는 경우 일 수 있습니다. 이를 피함으로써 코드를 더 깔끔하고 쉽게 이해하고 확장 할 수 있습니다.
답변 : 특히 객체 지향 소프트웨어 코드 인 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()를 사용하십시오. (정말로 필요하면 클래스 이름을 얻을 수 있습니다). 또한 사용할 수있는 라이브러리가 있으므로 이러한 작업을 처리하므로 클래스를 얻을 필요가 전혀 없습니다 (로깅의 경우 방금 준 예제).
타입이 필요 하신가요? 가장 좋은 방법은 객체의 실제 유형을 고려할 필요가없는 방식으로 코딩하는 것입니다. 대체 원리에 복종한다고 가정하면 직렬화 나 디버깅과 같은 작업을 수행 할 필요가 거의 없습니다. – Antimony
예를 들어, 일반 항목을 나타내는 추상 클래스 Item이있는 경우 특정 항목이 무엇인지 알 수있는 방법이 있어야하며 이에 따라 특정 작업을 수행하는 것이 좋습니다. –
@ user59559 : 실제로, 그것은 "좋은"것이 아닙니다. 그래서 "말하는 동기"에 대한 답변을 얻고 있습니다. – einpoklum