Java StringUtils vs!=无效的
我经常遇到非常不同的字符串验证,我们都知道有新的库,比如StringUtils。有人能解释一下为什么Java StringUtils vs!=无效的,java,string,validation,nullpointerexception,Java,String,Validation,Nullpointerexception,我经常遇到非常不同的字符串验证,我们都知道有新的库,比如StringUtils。有人能解释一下为什么StringUtils.isNotBlank(paymentTerm)或多或少优于paymentTerm!=空值 我觉得这个问题的前提已经不正确了。您不必在大多数地方检查空字符串——事实上,我认为您应该尽可能避免使用null,尤其是当存在另一个非空的sentinel值时。而且String已经有了一个非常好的“空”值:空字符串(“) 如果需要将“和”折叠成相同的值,那么在标准库中已经有了一个非常好的
StringUtils.isNotBlank(paymentTerm)
或多或少优于paymentTerm!=空值
我觉得这个问题的前提已经不正确了。您不必在大多数地方检查空字符串——事实上,我认为您应该尽可能避免使用null
,尤其是当存在另一个非空的sentinel值时。而且String
已经有了一个非常好的“空”值:空字符串(“
)
如果需要将“
和”
折叠成相同的值,那么在标准库中已经有了一个非常好的方法:.trim()
。但是,.trim()
作为字符串
上的实例方法,仅适用于非空字符串。这不一定是坏事
如果null
和“
对您来说意味着不同的东西,那么我认为您的数据模型太复杂了,您应该使用其他包装类,而不是直接使用String
。如果null
和“
的意思相同,那么您应该选择其中一个,并始终如一地使用它。这可能意味着需要一些!=null
检查,但是如果您发现自己在整个代码库中经常需要一个isnull或empty
或isNotBlank
帮助函数,我会说这是一种代码气味,您真的应该致力于解决底层数据模型问题,而不是担心一个很小的帮助函数
这是什么意思?在这个问题中,得票最多的答案指出,实际上只有两种情况下值可以为null:要么(1)null是有效值,要么(2)null不是有效值
案例(2)不是很有趣。Null不是有效值,因此我们不应该尝试处理它。如果有的话,我们只要在遇到异常时抛出一个异常即可。否则我们忽略它,让NullPointerException
自然发生。它不应该为null,因此根据定义,查找null是一种例外情况
如果null是有效值,则表示null具有语义含义。很可能是指某个值“不存在”或“无效”。这里有两个子情况:(1a)null表示与空字符串相同的内容,或者(1b)表示不同的内容
如果您有案例(1b),那么我认为您的域模型中需要一个新实体。例如,您可以创建一个类似于PaymentTerm
的类,该类具有单独的.isValid()
和.isPresent()
方法,以及一个.asString()
访问器来获取字符串值(如果存在)。(创建一个PaymentTerm
类有很多可能的方法,有很多可能的折衷:重点不是你需要这个特定的表单,而是你需要的不仅仅是一个原始字符串,一个你可以挂起方法的东西,因为这个东西现在在你的领域模型中是一流的实体。)
如果有case(1a),那么null和空字符串在语义上都表示相同的意思。但是他们在语法上是非常不同的!空字符串已经有了一个实例方法来检查它(.isEmpty()
),并且可以安全地存储、传递、与其他字符串进行比较等等
因此,案例(1a)有两种可能的解决方案:(1a.1)传递null和空字符串,并在任何地方检查其中一种,或者(1a.2)尽快将null规范化为空字符串,然后将null视为无效值,并在任何地方使用空字符串。根据您的输入格式,您甚至可能“免费”获得此行为(例如,空文本框自然将空字符串作为值,而不是null)
我的论点是,案例(1a.1)是一种代码气味。与其同时传递null和空字符串,并经常检查两者(手动或使用类似isNullOrEmpty
或isNotBlank
的方法),您应该尝试进入案例(2)或案例(1a.2)
注意,这个答案实际上意味着不是空的和!=空值
是次优值!在一个考虑因素充分的代码库中,您应该努力避免这两种情况,但我倾向于认为您应该努力避免类似isNotBlank
的情况
也就是说,如何检查null或空字符串并不十分重要。无论如何,JIT几乎肯定会内联检查,在许多情况下,窥视孔优化器将完全省略检查,如果它可以用另一种方式证明空安全性。要考虑的更重要的事情是<代码> null >代码>是否是程序中的一个有效值,如果是的话,它意味着一个值为null。 我觉得这个问题的前提已经是不正确的。您不必在大多数地方检查空字符串——事实上,我认为您应该尽可能避免使用null
,尤其是当存在另一个非空的sentinel值时。而且String
已经有了一个非常好的“空”值:空字符串(“
)
如果需要将“
和”
折叠成相同的值,那么在标准库中已经有了一个非常好的方法:.trim()
。但是,.trim()
作为字符串
上的实例方法,仅适用于非空字符串。这不一定是坏事
如果null
和“
对您来说意味着不同的东西,那么我认为您的数据模型太复杂了,您应该使用其他包装类,而不是直接使用String
。如果null
和“”
if (myString != null && myString.length() == 8)
if (StringUtils.isNotBlank(myString) && myString.length() == 8)
if (myString != null && myString.contains("word"))
if (String.isNotBlank(myString) && myString.contains("word"))
if ("word".equals(myString))
if (StringUtils.isNotBlank("word"))