“否定”一个实例的最佳方式

问题描述 投票:358回答:7

我在想是否存在更好/更好的方法来否定Java中的instanceof。实际上,我正在做的事情如下:

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

但我认为应该存在一个“漂亮”的语法。

有谁知道它是否存在,以及语法是什么样的?


编辑:美丽,我可能会这样说:

if(str !instanceof String) { /* do Something */ } // compilation fails
java syntax
7个回答
282
投票

不,没有更好的方法;你的是规范的。


118
投票

当你说“美丽”时,我不知道你的想象,但是这个怎么样?我个人认为它比你发布的经典形式更糟糕,但有人可能会喜欢它......

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

52
投票

你可以使用Class.isInstance方法:

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

......但它仍然被否定,非常丑陋。


20
投票

通常你不仅需要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();

12
投票

如果你可以使用静态导入,你的道德准则允许它们

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
投票

好吧,只是我的两美分,使用一个字符串方法:

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
投票

如果您发现它更容易理解,您可以使用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
}
© www.soinside.com 2019 - 2024. All rights reserved.