“否定”的最佳方式;一个运算符

我在想是否有一个更好/更好的方法来在Java中否定instanceof。 实际上,我做的是:

if(!(myObject instanceof SomeClass)) { /* do Something */ }

但我认为“美丽”;执行此操作的语法应该存在。

有人知道它是否存在吗?它的语法是什么样的?


<强>编辑: 说到美丽,我可能会这样说:

if(myObject !instanceof SomeClass) { /* do Something */ } // compilation fails
222492 次浏览

不,没有更好的办法;你的是典型的。

你可以使用Class.isInstance方法:

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

... 但它还是被否定了,而且很难看。

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

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

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

如果您可以使用静态导入,并且您的道德准则允许这样做

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");
}
}
}
这只是一个流畅的界面练习,我永远不会在现实生活中使用它!< br > 使用您的经典方式,它不会使其他阅读您的代码的人感到困惑!< / p >

我的观点是,使用一个is string方法

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

如果你觉得它更容易理解,你可以在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
}

你可以通过以下方法来实现。通过在开头添加!操作符来添加整个条件,就像下面代码片段中提到的那样,添加一个条件。

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

而不是

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

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

我是一个打字新手,在过去的几周里,我已经遇到了很多次这个S/O问题,所以对于谷歌人来说,打字的方法是创建一个像这样的字体保护:

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的唯一原因是类型保护是一种常见的惯例,所以如果你为其他接口编写它们,为类也编写它们是合理的/可以理解的/自然的。

关于用户定义类型保护的更多细节,如在文档中