인스턴스를 ‘부정’하는 가장 좋은 방법 instanceofJava에서 부정적이거나 더 좋은 방법이

instanceofJava에서 부정적이거나 더 좋은 방법이 있는지 생각하고있었습니다 . 실제로, 나는 다음과 같은 일을하고있다 :

if(!(str instanceof String)) { /* do Something */ }

그러나 나는 이것을하기위한 “아름다운”문법이 존재해야한다고 생각한다.

누구나 존재하고 구문이 어떻게 보이는지 아십니까?


편집 :
아름답게, 나는 이런 식으로 말할 수 있습니다 :

if(str !instanceof String) { /* do Something */ } // compilation fails



답변

더 좋은 방법은 없습니다. 당신은 정식입니다.


답변

나는 당신이 “아름다움”이라고 말할 때 당신이 무엇을 상상하는지 모르지만 이것에 대해 어떻게 생각합니까? 나는 개인적으로 당신이 게시 한 고전 양식보다 나쁘다고 생각하지만 누군가는 그것을 좋아할 것입니다 …

if (str instanceof String == false) { /* ... */ }


답변

다음 Class.isInstance방법을 사용할 수 있습니다 .

if(!String.class.isInstance(str)) { /* do Something */ }

…하지만 여전히 부정되고 꽤 추악합니다.


답변

보통 그냥 싶지 않아 if하지만 else절뿐만 아니라.

if(!(str instanceof String)) { /* do Something */ }
else { /* do something else */ }

로 쓸 수 있습니다

if(str instanceof String) { /* do Something else */ }
else { /* do something */ }

또는 코드를 작성하여 문자열인지 여부를 알 필요가 없습니다. 예 :

if(!(str instanceof String)) { str = str.toString(); } 

로 쓸 수 있습니다

str = str.toString();


답변

정적 임포트를 사용할 수 있고 도덕적 코드로 허용되는 경우

public class ObjectUtils {
    private final Object obj;
    private ObjectUtils(Object obj) {
        this.obj = obj;
    }

    public static ObjectUtils thisObj(Object obj){
        return new ObjectUtils(obj);
    }

    public boolean isNotA(Class<?> clazz){
        return !clazz.isInstance(obj);
    }
}

그리고…

import static notinstanceof.ObjectUtils.*;

public class Main {

    public static void main(String[] args) {
        String a = "";
        if (thisObj(a).isNotA(String.class)) {
            System.out.println("It is not a String");
        }
        if (thisObj(a).isNotA(Integer.class)) {
            System.out.println("It is not an Integer");
        }
    }
}

이것은 유창한 인터페이스 연습입니다. 실제 코드에서는 절대 사용하지 않을 것입니다!
고전적인 방법으로 가십시오. 다른 사람이 코드를 읽는 것을 혼동하지 않습니다!


답변

더 이해가 잘된다면 Java 8을 사용하여 이와 같은 작업을 수행 할 수 있습니다.

public static final Predicate<Object> isInstanceOfTheClass =
    objectToTest -> objectToTest instanceof TheClass;

public static final Predicate<Object> isNotInstanceOfTheClass =
    isInstanceOfTheClass.negate(); // or objectToTest -> !(objectToTest instanceof TheClass)

if (isNotInstanceOfTheClass.test(myObject)) {
    // do something
}


답변

좋아 내 두 센트, 문자열 방법을 사용하십시오 :

public static boolean isString(Object thing) {
    return thing instanceof String;
}

public void someMethod(Object thing){
    if (!isString(thing)) {
        return null;
    }
    log.debug("my thing is valid");
}