Лучший способ "отменить" экземпляр

Я думал, существует ли лучший/более хороший способ отрицать instanceof в Java. На самом деле я делаю что-то вроде:

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

Но я думаю, что "красивый" синтаксис для этого должен существовать.

Кто-нибудь знает, существует ли он и как выглядит синтаксис?


РЕДАКТИРОВАТЬ: красивым, я мог бы сказать что-то вроде этого:

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

Ответ 1

Нет, нет лучшего способа; ваш канонический.

Ответ 2

Я не знаю, что ты представляешь, когда говоришь "красиво", но как насчет этого? Я лично считаю это хуже классической формы, которую вы опубликовали, но кому-то это может понравиться...

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

Ответ 3

Вы можете использовать метод Class.isInstance:

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

... но он все еще отрицается и довольно уродлив.

Ответ 4

Обычно вам не нужно просто предложение 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();

Ответ 5

Если вы можете использовать статический импорт, и ваш моральный код позволяет им

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

Это просто умный интерфейс, я никогда не буду использовать его в реальном коде жизни! Пойдите для своего классического способа, это не будет путать кого-либо еще, читая ваш код!

Ответ 6

ok только мои два цента, используйте строковый метод:

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

Ответ 7

Если вы находите это более понятным, вы можете сделать что-то подобное с 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
}

Ответ 8

Это можно сделать, выполнив приведенный ниже способ. Просто добавьте условие, добавив скобку if(!(condition with instanceOf)) со всем условием, добавив в начале оператор !, как указано в приведенных ниже фрагментах кода.

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

вместо

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

Ответ 9

Или просто if-else...

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

Ответ 10

Что случилось с

if (!(x instanceof y)) {
}