我在想是否存在更好/更好的方法来否定Java中的instanceof
。实际上,我正在做的事情如下:
if(!(str instanceof String)) { /* do Something */ }
但我认为应该存在一个“漂亮”的语法。
有谁知道它是否存在,以及语法是什么样的?
编辑:美丽,我可能会这样说:
if(str !instanceof String) { /* do Something */ } // compilation fails
不,没有更好的方法;你的是规范的。
当你说“美丽”时,我不知道你的想象,但是这个怎么样?我个人认为它比你发布的经典形式更糟糕,但有人可能会喜欢它......
if (str instanceof String == false) { /* ... */ }
你可以使用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 */ }
或者您可以编写代码,这样您就不需要知道它是否为String。例如
if(!(str instanceof String)) { str = str.toString(); }
可写成
str = str.toString();
如果你可以使用静态导入,你的道德准则允许它们
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");
}
}
}
这只是一个流畅的界面练习,我从来没有在现实代码中使用它! 按照你的经典方式,它不会混淆任何阅读你的代码的人!
好吧,只是我的两美分,使用一个字符串方法:
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
}