- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我经常遇到非常不同的String验证,并且我们都知道有新的库,例如StringUtils。有人可以解释为什么StringUtils.isNotBlank(paymentTerm)
比paymentTerm != null
或多或少受到青睐吗?
最佳答案
我觉得这个问题的前提已经是一个不正确的问题。您不必在大多数地方检查空字符串-实际上,我认为您应该尽可能避免使用null
,特别是当存在另一个非空哨兵值时。而且String
已经有一个很好的“空”值:空字符串(""
)!
如果""
和" "
需要折叠为相同的值,则标准库中已经存在一个非常好的方法:.trim()
。但是,.trim()
作为String
的实例方法,仅适用于非空字符串。这不一定是一件坏事!
如果null
和""
对您来说意味着不同,那么我认为您的数据模型太复杂了,您应该使用其他包装类而不是直接使用String
。如果null
和""
表示相同的内容,则应选择一个或另一个,并始终使用它。这可能意味着需要进行一些!= null
检查,但是如果您发现自己在整个代码库中经常需要isNullOrEmpty
或isNotBlank
辅助函数,我会说这是一种代码味道,您确实应该努力修复潜在的数据模型问题,而不用担心很小的辅助函数。
这意味着什么?在Avoiding != null
statements问题中,投票最高的答案指出,实际上只有两种实例的值可以为null:(1)null是有效值,或者(2)null不是有效值值。
情况(2)不是很有趣。 Null不是有效值,因此我们不应该尝试处理它。如果有的话,如果遇到异常,我们只是抛出一个异常。否则,我们将忽略它,并让NullPointerException
自然发生。它不应该为null,因此按定义查找null是一种例外情况。
如果null为有效值,则表示null具有语义。最有可能意味着值“不存在”或“无效”。这里有两种情况:(1a)null表示与空字符串相同,或者(1b)表示不同。
如果您有案例(1b),那么我认为您需要在域模型中使用新实体。例如,您可以创建一个类似PaymentTerm
的类,该类具有单独的.isValid()
和.isPresent()
方法,以及一个.asString()
访问器以获取字符串值(如果存在)。 (创建PaymentTerm
类的很多可能方法,还有很多可能的折衷:重点不是您需要这种特定形式,而是需要除原始String
之外的其他东西,您可以可以使用hang方法,因为这是您域模型中的一流实体。)
如果您遇到大小写(1a),则从语义上讲,null和空字符串都意味着同一件事。但是它们在语法上有很大的不同!空字符串已经具有用于检查它的实例方法(.isEmpty()
),并且可以安全地存储,传递,与其他字符串相比,等等。
因此,情况(1a)有两种可能的解决方案:(1a.1)您同时传递null和空字符串,并且到处都需要检查其中一个,或者(1a.2)尽快将null归一化为空字符串,然后将null视为无效值,并在所有位置使用空字符串。根据您的输入格式,您甚至可以“免费”获得此行为(例如,一个空文本框自然会将空字符串作为值,而不是null)。
我的论点是案例(1a.1)是一种代码异味。您应该尝试进入大小写(2)或大小写(1a.2),而不是同时传递null和空字符串,并经常检查二者(手动或使用诸如isNullOrEmpty
或isNotBlank
之类的方法), 。
请注意,此答案实际上暗示isNotBlank
和!= null
都不是最优的!在结构良好的代码库中,您应该努力避免它们两者都出现,但是我倾向于认为您应该更努力避免像isNotBlank
这样的事情。
也就是说,如何检查null或空字符串并不十分重要。 JIT几乎肯定会以任何方式内联检查,并且在许多情况下,如果窥孔优化器可以通过另一种方式证明空安全性,它将完全消除它们。要考虑的更重要的事情是null
在您的程序中是否为有效值,如果是,则在语义上将值设为空意味着什么。
关于java - StringUtils vs!=空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52263237/
我已经为使用 JGroups 编写了简单的测试。有两个像这样的简单应用程序 import org.jgroups.*; import org.jgroups.conf.ConfiguratorFact
我有一个通过 ajax 检索的 json 编码数据集。我尝试检索的一些数据点将返回 null 或空。 但是,我不希望将那些 null 或空值显示给最终用户,或传递给其他函数。 我现在正在做的是检查
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Why does one often see “null != variable” instead of “
嗨在我们公司,他们遵循与空值进行比较的严格规则。当我编码 if(variable!=null) 在代码审查中,我收到了对此的评论,将其更改为 if(null!=variable)。上面的代码对性能有影
我正在尝试使用 native Cordova QR 扫描仪插件编译项目,但是我不断收到此错误。据我了解,这是代码编写方式的问题,它向构造函数发送了错误的值,或者根本就没有找到构造函数。那么我该如何解决
我在装有 Java 1.8 的 Windows 10 上使用 Apache Nutch 1.14。我已按照 https://wiki.apache.org/nutch/NutchTutorial 中提
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: what is “=null” and “ IS NULL” Is there any difference bet
Three-EyedRaven 内网渗透初期,我们都希望可以豪无遗漏的尽最大可能打开目标内网攻击面,故,设计该工具的初衷是解决某些工具内网探测速率慢、运行卡死、服务爆破误报率高以及socks流
我想在Scala中像在Java中那样做: public void recv(String from) { recv(from, null); } public void recv(String
我正在尝试从一组图像补丁中创建一个密码本。我已将图像(Caltech 101)分成20 X 20图像块。我想为每个补丁创建一个SIFT描述符。但是对于某些图像补丁,它不返回任何描述符/关键点。我尝试使
我在验证器类中自动连接的两个服务有问题。这些服务工作正常,因为在我的 Controller 中是自动连接的。我有一个 applicationContext.xml 文件和 MyApp-servlet.
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭10 年前。 问题必须表现出对要解决的问题的最低程度的了解。告诉我们您尝试过做什么,为什么不起作用,以
大家好,我正在对数据库进行正常的选择,但是 mysql_num_rowsis 为空,我不知道为什么,我有 7 行选择。 如果您发现问题,请告诉我。 真的谢谢。 代码如下: function get_b
我想以以下格式创建一个字符串:id[]=%@&stringdata[]=%@&id[]=%@&stringdata[]=%@&id[]=%@&stringdata[]=%@&等,在for循环中,我得到
我正在尝试使用以下代码将URL转换为字符串: NSURL *urlOfOpenedFile = _service.myURLRequest.URL; NSString *fileThatWasOpen
我正在尝试将NSNumber传递到正在工作的UInt32中。然后,我试图将UInt32填充到NSData对象中。但是,这在这里变得有些时髦... 当我尝试将NSData对象中的内容写成它返回的字符串(
我正在进行身份验证并收到空 cookie。我想存储这个 cookie,但服务器没有返回给我 cookie。但响应代码是 200 ok。 httpConn.setRequestProperty(
我认为 Button bTutorial1 = (Button) findViewById(R.layout.tutorial1); bTutorial1.setOnClickListener
我的 Controller 中有这样的东西: model.attribute("hiringManagerMap",hiringManagerMap); 我正在访问此 hiringManagerMap
我想知道如何以正确的方式清空列表。在 div 中有一个列表然后清空 div 或列表更好吗? 我知道这是一个蹩脚的问题,但请帮助我理解这个 empty() 函数:) 案例)如果我运行这个脚本会发生什么:
我是一名优秀的程序员,十分优秀!