gpt4 book ai didi

java - boolean 困境

转载 作者:行者123 更新时间:2023-11-29 08:45:56 26 4
gpt4 key购买 nike

考虑以下 Java 方法:

public Boolean compare(String val1, String val2) {
return val1.length() > 0 && val1.equals(val2);
}

如果不明显,此方法首先检查 val1 长度是否大于 0(即我们是否有要比较的内容),然后应用 .equal() 方法。

当然,进退两难是因为如果 val1.length() 不大于零,该方法将返回 false。坏是因为不知道假货来自哪里; val1.length() 方法或 equals() 方法。

重写应该可以解决问题:

public Boolean compare(String val1, String val2) {
if (val1.length() > 0) {
return val1.equals(val2);
}
return // Oh dear.... stuck again !
}

这里明显的问题是 Java 方法要求方法返回指定的返回类型。在这种情况下,我可以返回 true 或 false(实际上,因为我指定了 Boolean 而不是 boolean [capital B vs lower B] 我也可以返回 null)。那么在这里返回什么呢?事实证明,true 或 false 都不起作用,因为如果 val1.length() 为 false,无论我的返回值是什么,都会返回什么,再次导致可能的误报或漏报。尽管我可以在此处设置一个 null,但我的调用代码将生成一个 NullPointerException —— 所以没有 null。

我需要的不是 boolean 值,而是TRILEAN!所以,我设计了这个:

// Trilean.java
public enum Trilean {
FALSE,
TRUE,
IGNORE
}

然后像这样重写我的方法:

public Trilean compare(String val1, String val2) {
if (val1.length() > 0) {
return (val1.equals(val2)) ? Trilean.TRUE : Trilean.FALSE;
}
return Trilean.IGNORE;
}

这有效:

if (compare(val1, val2) == Trilean.TRUE) {
// do stuff
}

例如,当我想对字符串执行正则表达式时,此逻辑(顺便说一句)变得有效,比如说我的正则表达式规则要求以字母或数字开头的字符串,但我只想运行该正则表达式,如果我的字符串实际上是'空。以一个 servlet 为例,我可能有一个不需要的 html 输入字段。使用这些严格的规则“^[A-Za-z0-9][A-Za-z0-9]*$”进行测试会导致我的 val.match() 方法返回 true 或 false,从而破坏我的表单字段验证, 在非必填字段上。

所以,

public Boolean validateField(String data) {
return data.length() > 0 && data.match("^[A-Za-z0-9][A-Za-z0-9]*$");
}

会产生相同的误报或漏报。

问题是:对于这样的困境,您采取了什么方法?如何在坚持使用 boolean 值的同时改进此逻辑?

最佳答案

好吧,我的“方法”如下:

  1. 确定我感兴趣的检查结果有多少
  2. 使用适当的返回类型

如果我只需要采取行动或不采取行动,那么 boolean 就可以正常工作。如果我需要三种结果,例如匹配时执行、不匹配时执行和跳过,那么我通常会使用 Booleannull 表示“跳过”情况。如果结果超过 3 个,或者我希望它们的数量发生变化,我会使用 enum

关于java - boolean 困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25377102/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com