我正在编写查询数据库以获取数据的代码。有一些类是由List
s组成的,但有时列表或其他属性不能启动,它们的值是null
,所以我需要写list!=null || list.isEmpty
或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;
}
正如你所看到的,在这个类中有一些列表和其他属性,都可以是null
或空的,我能做些什么来避免它吗?
答案取决于null
是否具有特殊含义。例如,对于String
字段,您的应用程序需要区分null
和""
吗?对于Collection
值字段,它需要区分null
和空集合对象吗?
如果答案是"否",那么你可以编写你的"数据对象"类来将空归一化为各自的"带内"值。您可以在getter、setter或构造函数中执行此操作,具体取决于对象是如何从数据库中具体化的。
你可以做的其他一些事情是:
-
修改数据库模式,使相应的列"not null"
-
如果你正在使用ORM或数据绑定机制,尝试配置(通过注释或其他)使用"in band"值而不是
null
。
将null
转换为""
或空数组或集合的要点是,您不需要将"in带"值视为特殊情况…除非您的应用程序的业务逻辑特别要求这样做。
简而言之,如果您系统地排除了null
值,则不需要在业务逻辑中测试它们。
注意,这种方法并不总是有效。让我恼火的是在servlet中从HTTPRequest
对象获取参数:
-
应用程序可能必须处理4种不同的情况:
-
参数不存在
-
参数不存在/为空值
-
参数存在非空值
-
参数多次出现
-
-
这些参数是从一个标准的API中获取的,而不是一个可以根据web应用程序的需求进行规范化的自定义类。
解决这个问题最简单的方法是使用CollectionUtils.isEmpty。
如果为空或为null则返回true
这样你可以在一行中完成。
当涉及到"属性"时,有一些设计模式可以提供帮助。或者,您可以使用Guava的Optional类。Guava's可选类
您可以编写一个函数来检查一个对象是否为null
和/或如果它是一个String,它是否是""
。然后只需在每次需要检查所有条件时调用该函数。让它返回一个布尔值,这样你就可以把它插入到if
语句中。
boolean check(Object o)
{
if (o != null)
{
if (o instanceof String)
{
if (((String) o).equals(""))
return false;
}
return true;
}
return false;
}
参考rcook在评论中的建议,以获得更好的实现
我认为这里有两个问题:一个是你必须检查null
值,我绝对同意这是愚蠢的。问题是null
是Java语言的本机,所以使它稍微好一点的唯一方法是使用Steve P和tieTYT提到的方法。然而,还有另一种处理null的方法,即不使用它。当然,您不能完全避免它,但至少在您自己的代码中,您应该消除所有null
引用。这里有一些很好的参数,我不会在这里讨论,但您可以阅读避免!= null语句了解更多细节。
如果您对基于java的语言Scala感兴趣,可以通过实现Option类来很好地实现这一点,该类可以判断一个值是否存在(等于null
值)。不错的博客文章在这里:http://jim-mcbeath.blogspot.fr/2008/10/avoiding-nulls.html
(大部分)将null问题存储起来后,下一个问题将是在使用集合时检查isEmpty
或类似的问题。就像你说的,这让人头疼。但我发现这些检查基本上是可以避免的。当然,这完全取决于您需要对集合做什么,但在大多数情况下,集合以某种方式用于遍历或操作。在Java中使用foreach-loop将确保如果集合中没有任何内容,则不执行任何操作。整洁。
在某些情况下,集合不能为空。其中一些可以通过良好的设计来避免(例如,允许空列表,确保没有列表为空等),但是,对于其余的,根本没有办法。永远。但是,已经消除了空检查,调用一些isEmpty
现在和然后不是那么糟糕:-)
希望有帮助。