Ответ 1
Нет, нет лучшего способа; ваш канонический.
Я думал, существует ли лучший/более хороший способ отрицать instanceof
в Java. На самом деле я делаю что-то вроде:
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 */ }
Или вы можете написать код, поэтому вам не нужно знать, есть ли его строка или нет. например.
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");
}
}
}
Это просто умный интерфейс, я никогда не буду использовать его в реальном коде жизни! Пойдите для своего классического способа, это не будет путать кого-либо еще, читая ваш код!
ok только мои два цента, используйте строковый метод:
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(!(condition with instanceOf))
со всем условием, добавив в начале оператор !
, как указано в приведенных ниже фрагментах кода.
if(!(str instanceof String)) { /* do Something */ } // COMPILATION WORK
вместо
if(str !instanceof String) { /* do Something */ } // COMPILATION FAIL
Или просто if-else...
if (str instanceof String) {
} else {
// Your code, please.
}
Что случилось с
if (!(x instanceof y)) {
}