web-dev-qa-db-ja.com

instanceofを「無効にする」ための最良の方法

私は、Javaでinstanceofを否定するためのより良い/より良い方法があるのではないかと考えていました。実際、私は次のようなことをしています。

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

しかし、私はこれを行うための「美しい」構文が存在するべきだと思います。

誰かがそれが存在するかどうか、そしてその構文はどのようになっているのか知っていますか?


編集:美しく、私はこのようなことを言うかもしれません:

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

いいえ、それ以上の方法はありません。あなたは規範的です。

279
maerics

私があなたが「美しい」と言うときあなたが何を想像するかわかりません、しかしこれについてはどうですか?私は個人的にはあなたが投稿した古典的な形式より悪いと思いますが、誰かがそれを好むかもしれません...

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

Class.isInstance メソッドを使うことができます。

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

...しかし、それはまだ否定的でかなり醜いです。

52
dacwe

通常はifだけでなくelse節も必要です。

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

と書くことができます

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

あるいは、コードを記述して、それがStringかどうかを知る必要がないようにすることもできます。例えば.

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

と書くことができます

str = str.toString();
20
Peter Lawrey

あなたが静的インポートを使うことができ、そしてあなたの道徳的なコードがそれらを許すならば

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");
        }
    }    
}

これはただ流暢なインターフェースの練習です、私は現実のコードでそれを決して使いません!
あなたの古典的な方法を使ってください。他の人があなたのコードを読んでいるのを混乱させることはありません。

12
Pablo Grisafi

大体2セントですが、is stringメソッドを使用してください。

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");
}
3
tibi

もっとわかりやすい場合は、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
}
3
Paul