Лучший способ «отрицать» экземпляр - PullRequest
364 голосов
/ 30 января 2012

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

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

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

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


EDIT: По красоте я могу сказать что-то вроде этого:

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

Ответы [ 7 ]

283 голосов
/ 30 января 2012

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

119 голосов
/ 30 января 2012

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

if (str instanceof String == false) { /* ... */ }
53 голосов
/ 30 января 2012

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

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

... но это все еще отрицательно и довольно некрасиво.

20 голосов
/ 30 января 2012

Обычно вам нужен не только 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();
12 голосов
/ 30 января 2012

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

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

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

3 голосов
/ 10 октября 2018

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

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

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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...