2012-01-30 15 views
262

Myślałem, czy istnieje lepszy/lepszy sposób negowania instanceof w Javie. Właściwie robię coś takiego:Najlepszy sposób na "zanegowanie" instancji

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

Ale myślę, że powinna istnieć „piękny” składni, aby to zrobić.

Ktoś wie, czy istnieje i jak wygląda składnia?


EDIT: przez piękne, mogę powiedzieć coś takiego:

if(str !instanceof String) { /* do Something */ } // compile failure 
+16

Nienawidzę reguły pierwszeństwa dla 'instanceof' tak wiele ... – luiscubal

+4

Zawsze można utworzyć zmienną, np. 'Boolean strIsString = str instanceof String;' ... – vaughandroid

+0

yeah @ Baqueta, jest opcją. Ale jakie różnice mogą wystąpić w używaniu pamięci w jednej lub drugiej składni? – caarlos0

Odpowiedz

207

Nie, nie ma lepszego sposobu; twój jest kanoniczny.

+0

Tak, wydaje się. Dzięki. – caarlos0

42

Można użyć metody Class.isInstance:

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

... ale nadal jest negowana i dość brzydki.

+4

jest nieco lepszy, nadmiarowy nawias sprawia, że ​​kod jest brzydki, IMHO. – caarlos0

+0

Czy to nie jest dużo wolniejsze? – maxammann

+4

To ma inne zachowanie. Słowo kluczowe instanceof zawiera podklasy, metoda nie, musisz użyć klasy Class.isAssignableFrom, aby powielić zachowanie. –

15

Zwykle nie chcesz również tylko klauzuli if, ale także else.

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

można zapisać jako

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

Lub można napisać kod, dzięki czemu nie trzeba wiedzieć, czy jest to ciąg, czy nie. na przykład

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

można zapisać jako

str = str.toString(); 
84

Nie wiem, co można sobie wyobrazić, kiedy mówisz „piękne”, ale co z tego? Osobiście uważam, że jest gorzej niż w klasycznej formie ty pisał, ale ktoś może się spodoba ...

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

nadal brzydki, będę edytować pytanie ... proszę czekać sekundę .. – caarlos0

+16

+1 za realną alternatywę – hidralisk

+11

Podwójna logika rani moją głowę :) – rogerdpack

12

Jeśli można użyć importu statycznych, a kodeks moralny pozwala im

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

i wtedy. ..

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

To tylko płynne ćwiczenie interfejsu, nigdy nie użyłbym tego w prawdziwym kodzie!
Idź na swój klasyczny sposób, nie będzie mylić nikogo, kto czyta twój kod!

+0

Nie lubię statycznych importów .. tak dzięki za spróbujcie pomóc :) – caarlos0

+5

+1 za przebiegły kod – hidralisk

2

ok tylko moje dwa centy, używanie jest metoda ciąg:

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

Albo po prostu if-else ...

if (str instanceof String) { 
} else { 
    // Your code, please. 
} 
+1

Chce zanegować '(str instanceof String) '. Jest to sprzeczne z prawami programowania. –

-1

Co z

if (!(x instanceof y)) { 
} 
Powiązane problemy