553 Stimmen

Der beste Weg, eine instanceof zu "negieren

Ich habe mir überlegt, ob es einen besseren/schöneren Weg gibt, eine instanceof in Java. Eigentlich mache ich so etwas wie:

if(!(myObject instanceof SomeClass)) { /* do Something */ }

Aber ich denke, dass es eine "schöne" Syntax dafür geben sollte.

Weiß jemand, ob es so etwas gibt, und wie die Syntax aussieht?


EDIT: Mit schön könnte ich so etwas sagen:

if(myObject !instanceof SomeClass) { /* do Something */ } // compilation fails

405voto

maerics Punkte 141984

Nein, es gibt keinen besseren Weg; Ihrer ist kanonisch.

167voto

Natix Punkte 13576

Ich weiß nicht, was Sie sich vorstellen, wenn Sie "schön" sagen, aber was ist damit? Ich persönlich finde es schlechter als die klassische Form, die du gepostet hast, aber vielleicht gefällt es ja jemandem...

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

65voto

dacwe Punkte 42433

Sie könnten die Class.isInstance Methode:

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

... aber es wird immer noch negiert und ist ziemlich hässlich.

33voto

Peter Lawrey Punkte 511323

Normalerweise wollen Sie nicht nur eine if sondern ein else Klausel auch.

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

kann geschrieben werden als

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

Oder Sie können den Code so schreiben, dass Sie nicht wissen müssen, ob es ein String ist oder nicht. z.B.

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

kann geschrieben werden als

str = str.toString();

13voto

Pablo Grisafi Punkte 5003

Wenn Sie statische Importe verwenden können und Ihr moralischer Code sie zulässt

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

Und dann...

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

Dies ist nur eine Übung für eine fließende Schnittstelle, ich würde das nie in echtem Code verwenden!
Entscheiden Sie sich für den klassischen Weg, das wird niemanden verwirren, der Ihren Code liest!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X