我正在编写查询数据库以获取数据的代码。有些类由List
组成,但有时无法启动列表或其他属性且值为null
,因此我需要编写list!=null || list.isEmpty
或{{1}在我可以使用该属性之前。
不幸的是,很容易忘记它,而且每次操作属性时我都认为这样做很难看。我将编写一些代码来解释它。
attribute != null
正如您所看到的,此类中有一些列表和其他属性,可能都是public class SpotVo {
private Double avg;
private String brief;
private ArrayList<HotelVo> hotels;
private int id;
private ArrayList<byte[]> images;
private AddressVo location;
private String name;
private ArrayList<RestaurantVo> restaurants;
}
或空,我可以做些什么来避免它吗?
答案 0 :(得分:4)
答案取决于null
是否具有特殊含义。例如,对于String
字段,您的应用是否需要区分null
和""
?对于Collection
值字段,是否需要区分null
和空集合对象?
如果答案是&#34; no&#34;,那么您可以编写&#34;数据对象&#34;将空值标准化为相应的&#34;带内的类#34;值。您可以在getter或setter或构造函数中执行此操作,具体取决于对象是如何从数据库中实现的。
您可以做的其他一些事情是:
更改数据库架构以使相应的列&#34;不为空&#34;。
如果您正在使用ORM或数据绑定机制,请尝试配置(通过注释或其他)以使用&#34; in band&#34;值而不是null
。
将null
转换为""
或空数组或收藏品的重点是您不需要处理乐队中的&#34;&#34;值作为一种特殊情况......除非你的应用程序的业务逻辑特别需要这个。
简而言之,如果您系统地标出null
值,则无需在业务逻辑中对其进行测试。
请注意,这种方法并不总是有效。令我烦恼的情况是从servlet中的HTTPRequest
对象获取参数:
该应用程序可能需要处理4种不同的情况:
参数不存在
参数无值/空值
参数以非空值显示
参数多次出现。
参数是从标准API而不是自定义类中提取的,可以根据webapp的要求对这些值进行规范化。
答案 1 :(得分:0)
您可以编写一个函数来检查对象是否为null
和/或它是否为字符串,是""
。然后只需在每次需要检查所有条件时调用该函数。让它返回一个布尔值,以便您可以将它插入if
语句中。
boolean check(Object o)
{
if (o != null)
{
if (o instanceof String)
{
if (((String) o).equals(""))
return false;
}
return true;
}
return false;
}
请参阅评论中的rcook建议,以便更好地实施此建议。
答案 2 :(得分:0)
解决此问题的最简单方法是使用CollectionUtils.isEmpty。
返回:如果为空,则返回true或null
这样你就可以在一行中完成。
说到“属性”,有一些设计模式可以帮助解决这个问题。或者,您可以使用Guava's Optional课程。您可以在此处详细了解:What's the point of Guava's Optional class
答案 3 :(得分:0)
我认为这里存在两个问题:
一个是你必须检查null
值,我绝对同意这是愚蠢的。问题是null
是Java语言的原生,因此使其稍微好一点的唯一方法是使用类似Steve P和tieTYT提到的方法。然而,有另一种处理null的方法是从不使用它。当然你不能完全避免它,但至少在你自己的代码中你应该删除所有null
- 引用。这里有一些很好的论据,我不会在这里讨论,但你可以阅读Avoiding != null statements了解更多细节。
如果您对基于Java的语言Scala感兴趣,可以通过实现一个可以判断值是否存在的Option类(等于null
值)来很好地开发它。关于它的好博文:http://jim-mcbeath.blogspot.fr/2008/10/avoiding-nulls.html
让(大部分)存放空问题,下一个问题是在使用集合时检查isEmpty
或类似问题。正如你所说,这就是屁股的痛苦。但我实际上发现这些检查可以在很大程度上避免。这一切都取决于您对集合当然需要做什么,但在大多数情况下,集合用于以某种方式进行遍历或操作。在Java中使用foreach-loop将确保如果集合中没有任何内容,则不会执行任何操作。整齐。
在某些情况下,集合不得为空。其中一些可以避免,通过一个好的设计(例如一个允许空列表,确保没有列表是空的等),但是,对于其余的,没有办法。永远。但是,在消除了空检查后,偶尔调用几个isEmpty
并不是那么糟糕: - )
希望有所帮助。