Java “最好的方法”;否定;一个例子

Java “最好的方法”;否定;一个例子,java,syntax,Java,Syntax,我在想,是否存在一种更好/更好的方法来否定Java中的实例。 事实上,我正在做一些类似的事情: if(!(str instanceof String)) { /* do Something */ } 但我认为应该有一个“漂亮”的语法来实现这一点 有人知道它是否存在,以及语法是什么样子的吗 编辑: 说到美丽,我可以这样说: if(str !instanceof String) { /* do Something */ } // compilation fails 不,没有更好的办法;您的方法

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

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