Java “最好的方法”;否定;一个例子
我在想,是否存在一种更好/更好的方法来否定Java中的Java “最好的方法”;否定;一个例子,java,syntax,Java,Syntax,我在想,是否存在一种更好/更好的方法来否定Java中的实例。 事实上,我正在做一些类似的事情: if(!(str instanceof String)) { /* do Something */ } 但我认为应该有一个“漂亮”的语法来实现这一点 有人知道它是否存在,以及语法是什么样子的吗 编辑: 说到美丽,我可以这样说: if(str !instanceof String) { /* do Something */ } // compilation fails 不,没有更好的办法;您的方法
实例。
事实上,我正在做一些类似的事情:
if(!(str instanceof String)) { /* do Something */ }
但我认为应该有一个“漂亮”的语法来实现这一点
有人知道它是否存在,以及语法是什么样子的吗
编辑:
说到美丽,我可以这样说:
if(str !instanceof String) { /* do Something */ } // compilation fails
不,没有更好的办法;您的方法是规范的。您可以使用以下方法:
。。。但是它仍然是否定的,而且相当丑陋。通常你不想要一个if
子句,而是一个else
子句
if(!(str instanceof String)) { /* do Something */ }
else { /* do something else */ }
可以写成
if(str instanceof String) { /* do Something else */ }
else { /* do something */ }
str = str.toString();
或者您可以编写代码,这样您就不需要知道它是否是字符串。e、 g
if(!(str instanceof String)) { str = str.toString(); }
可以写成
if(str instanceof String) { /* do Something else */ }
else { /* do something */ }
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);
}
}
这只是一个流畅的界面练习,我从来没有在实际代码中使用过
按照你的经典方式去做,它不会让其他阅读你代码的人感到困惑 好的,就我的两分钱,使用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
}
公共静态最终谓词IsInstanceOfClass=
objectToTest->objectToTest类实例;
公共静态最终谓词为类的NotInstanceoftheClass=
IsInstanceOfClass.negate();//或objectToTest->!(对象到类的测试实例)
if(类测试(myObject))的isNotInstanceOfTheClass.test{
//做点什么
}
您可以通过以下方法实现。。只需通过添加括号来添加一个条件,如果(!(带有instanceOf的条件))
通过添加来添加整个条件代码>运算符,以下面代码段中提到的方式开始
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)){…}
是值得的
我是一个typescript新手,在过去的几周里,我多次碰到这个S/O问题,所以对于谷歌来说,typescript的方法是创建一个typeguard,如下所示:
if(str !instanceof String) { /* do Something */ } // compilation fails
打字机
用法
我想这可能适用于typescript而不是常规js的唯一原因是typeguards是一种常见的约定,因此如果您为其他接口编写它们,那么为类编写它们也是合理/可以理解/自然的
关于用户定义类型保护的更多细节如下我非常讨厌instanceof
的优先规则……您可以创建一个变量,比如boolean strIsString=str instanceof String代码>…是的@Baqueta,是一个选项。但是,在一种或另一种语法中,内存使用会有什么不同?这是一个怎样的建设性评论?Java创建者可能会引入一个新的关键字:notinstanceof。只是我的2美分^^稍微好一点,多余的括号会让代码难看,嗯。这不是慢了很多吗?这有不同的行为。instanceof关键字包含子类,方法不包含子类,您需要使用Class.isAssignableFrom来复制该行为。@ChrisCooper这不是真的:如果指定的对象参数是所表示的类(或其任何子类)的实例,则该方法返回true
我不喜欢静态导入。。无论如何,感谢您的帮助:)关于双逻辑,您可以使用!=true
而不是==false
:这有助于我理解如果(!(str instanceof String))
是唯一正确的方法,我需要停止思考其他方法我喜欢这种解决方案,因为我不需要在阅读时建立金属堆栈!SonarLint将报告关于这种编码形式的一个问题(作为一种次要的代码气味),其信息是:删除文本“false”布尔值。对于Java 11,如果(Predicate.not(IsInstanceOfClass.test(myObject)){…
,这应该可以。在我看来不是更好,但应该可以!我认为这是这里的最佳答案(第一部分)这一定是一个可接受的答案,因为IntelliJ也建议使用这种方法。
if (!isHTMLInputElement(x)) throw new RangeError()
// do something with an HTMLInputElement