instanceof 대 getClass ()
내가 사용하는 경우 성능을 얻을 참조 getClass()및 ==이상 연산자 instanceOf연산자.
Object str = new Integer("2000");
long starttime = System.nanoTime();
if(str instanceof String) {
System.out.println("its string");
} else {
if (str instanceof Integer) {
System.out.println("its integer");
}
}
System.out.println((System.nanoTime()-starttime));
starttime = System.nanoTime();
if(str.getClass() == String.class) {
System.out.println("its string in equals");
} else {
if(str.getClass() == Integer.class) {
System.out.println("its integer");
}
}
System.out.println((System.nanoTime()-starttime));
어떤 가이드 라인 하나를 사용할 수 있는가 getClass()또는 instanceOf?
시나리오가 주어지면 : 일치해야 할 정확한 클래스, 즉 String, Integer(이것들은 최종 클래스입니다) 등을 알고 있습니다 .
instanceOf운영자가 나쁜 습관을 사용 하고 있습니까?
instanceof과 의 성능 getClass() == ...이 다른 이유 는 서로 다른 일을하고 있기 때문입니다.
instanceof왼쪽 (LHS)에있는 객체 참조가 오른쪽 (RHS)에있는 유형의 인스턴스 인지 또는 일부 하위 유형 인지 테스트합니다 .getClass() == ...유형이 동일한 지 테스트합니다.
따라서 권장 사항은 성능 문제를 무시하고 필요한 답변을 제공하는 대안을 사용하는 것입니다.
그리고 네, 둘 중 하나의 남용은 "디자인 냄새"일 수 있습니다. 주의하지 않으면 새로운 하위 클래스를 추가하면 상당한 양의 코드 재 작업이 발생하는 디자인이됩니다. 대부분의 상황에서 선호되는 접근 방식은 다형성을 사용하는 것입니다.
"디자인 냄새"가 아닌 경우가 있습니다. 예를 들어, equals(Object)인수의 실제 유형을 테스트하고 false일치하지 않으면 반환 해야합니다. 이것은 getClass().
클래스를 정확히 일치 시키 시겠습니까? 예를 들어, FileInputStream의 하위 클래스 대신 일치 만 FileInputStream하시겠습니까? 그렇다면 getClass()및 ==. 저는 일반적으로에서이 작업을 수행 equals하므로 X의 인스턴스가 X의 하위 클래스의 인스턴스와 같지 않은 것으로 간주됩니다. 그렇지 않으면 까다로운 대칭 문제가 발생할 수 있습니다. 반면에 두 개체가 하나의 특정 클래스보다 같은 클래스 라는 것을 비교하는 데 더 유용합니다 .
그렇지 않으면 instanceof. 와 함께 getClass()시작할 때 null이 아닌 참조가 있는지 확인해야합니다. 그렇지 않으면를 얻을 수 NullPointerException있지만 첫 번째 피연산자가 null 인 경우 instanceof에만 반환 false됩니다.
개인적 instanceof으로 더 관용적 이라고 말하고 싶지만 둘 중 하나 를 광범위하게 사용 하는 것은 대부분의 경우 디자인 냄새입니다.
이 질문을받은 지 오랜만이라는 것을 알고 있지만 어제 대안을 배웠습니다.
우리 모두는 당신이 할 수 있다는 것을 알고 있습니다.
if(o instanceof String) { // etc
하지만 어떤 종류의 수업이 필요한지 정확히 모른다면 어떨까요? 일반적으로 다음을 수행 할 수 없습니다.
if(o instanceof <Class variable>.getClass()) {
컴파일 오류가 발생합니다.
대신, 여기에 대안이 있습니다-isAssignableFrom ()
예를 들면 :
public static boolean isASubClass(Class classTypeWeWant, Object objectWeHave) {
return classTypeWeWant.isAssignableFrom(objectWeHave.getClass())
}
getClass ()에는 아래 코드의 출력에 설명 된대로 객체가 동일한 클래스, 동일한 런타임 유형의 다른 객체와 만 동일하다는 제한이 있습니다.
class ParentClass{
}
public class SubClass extends ParentClass{
public static void main(String []args){
ParentClass parentClassInstance = new ParentClass();
SubClass subClassInstance = new SubClass();
if(subClassInstance instanceof ParentClass){
System.out.println("SubClass extends ParentClass. subClassInstance is instanceof ParentClass");
}
if(subClassInstance.getClass() != parentClassInstance.getClass()){
System.out.println("Different getClass() return results with subClassInstance and parentClassInstance ");
}
}
}
출력 :
SubClass는 ParentClass를 확장합니다. subClassInstance는 instanceof ParentClass입니다.
다른 getClass ()는 subClassInstance 및 parentClassInstance로 결과를 반환합니다.
참고URL : https://stackoverflow.com/questions/4989818/instanceof-vs-getclass
'Programing' 카테고리의 다른 글
| Firebase FCM은 onTokenRefresh ()를 강제로 호출합니다. (0) | 2020.08.12 |
|---|---|
| 게터와 세터는 어떻게 작동합니까? (0) | 2020.08.12 |
| Docker ADD 대 VOLUME (0) | 2020.08.12 |
| TD 내에서 위치 상대 / 절대 위치를 사용하십니까? (0) | 2020.08.12 |
| Android : 콘텐츠 URI에서 파일 URI를 가져 오나요? (0) | 2020.08.12 |