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

时间:2012-01-30 17:35:35

标签: java syntax

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

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

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

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


修改 美丽的,我可能会这样说:

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

9 个答案:

答案 0 :(得分:277)

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

答案 1 :(得分:116)

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

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

答案 2 :(得分:52)

您可以使用Class.isInstance方法:

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

......但它仍然被否定而且相当丑陋。

答案 3 :(得分:20)

通常,您不仅需要if,还需要else条款。

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

可以写成

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

或者您可以编写代码,这样您就不需要知道它是否是String。 e.g。

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

可以写成

str = str.toString();

答案 4 :(得分: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");
        }
    }    
}

这只是一个流畅的界面练习,我从未在现实代码中使用它!
按照你的经典方式,它不会让其他人在阅读你的代码时感到困惑!

答案 5 :(得分:3)

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

'getElementsByTagName' is undefined or null reference.

答案 6 :(得分: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
}

答案 7 :(得分:1)

我同意,在大多数情况下,if (!(x instanceof Y)) {...}是最好的方法,但是在某些情况下,创建isY(x)函数以便您可以if (!isY(x)) {...}是值得的。

我是一个打字稿新手,在过去的几周中,我多次碰到这个S / O问题,所以对于Google员工来说,打字稿的实现方法是创建一个这样的打字机: / p>

typeGuards.ts

export function isHTMLInputElement (value: any): value is HTMLInputElement {
  return value instanceof HTMLInputElement
}

用法

if (!isHTMLInputElement(x)) throw new RangeError()
// do something with an HTMLInputElement

我猜想为什么它可能适合于Typescript而不适用于普通的js的唯一原因是typeguard是一个通用约定,因此,如果您为其他接口编写它们,那么为类编写它们也是合理/可理解/自然的

有关诸如in the docs这样的用户定义类型防护的详细信息,

答案 8 :(得分:0)

您可以通过以下方式实现。.只需添加括号if(!(condition with instanceOf))来添加条件,并在开始时添加!运算符即可,就像下面的代码片段所述。 >

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

代替

if(str !instanceof String) { /* do Something */ } // COMPILATION FAIL
相关问题