我正在编写查询数据库以获取数据的代码。有一些类是由List组成的,但有时列表或其他属性不能启动,它们的值是null,所以我需要先写list!=null || list.isEmpty或attribute != null才能使用该属性。
不幸的是,很容易忘记它,我真的认为每次操作一个属性时都这样做是很难看的。我要写一些代码来解释它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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或空的,我可以做些什么来避免它吗?
- 我认为避免这种丑陋代码的最好方法是总是编写简短、简单、简洁的方法,这些方法只执行一项基本任务。如果这样做,通常可以在每个方法的顶部执行一个干净的空检查,如果重要的内容为空,则立即退出。我在学校有个教授告诉我们,"你写的每一个函数都应该少于60行"。这是我得到的最好的建议。
- @杰罗伊"每种方法都应该少于60行"阿门,兄弟。
- 我还学了另一个版本,它踢了一个写方法的人,这个词有10行。
- @SSJ ^^我希望我能从评论中理解…
- @如果你不明白的话,你可能会更快乐。
- 成为经理。
- @Hotlicks不能再同意了
答案取决于null是否具有特殊意义。例如,对于String字段,您的应用程序是否需要区分null和""?对于Collection值字段,是否需要区分null和空集合对象?
如果答案是"否",那么可以编写"数据对象"类,将空值规范化为相应的"带内"值。您可以在getter、setter或构造函数中这样做,具体取决于对象是如何从数据库具体化的。
您可以做的其他一些事情是:
将null转换为""或空数组或集合的要点是,您不需要将"带内"值视为特殊情况…除非应用程序的业务逻辑特别要求这样做。
简而言之,如果您系统地消除了null值,则不需要在业务逻辑中测试它们。
注意,这种方法并不总是有效的。让我恼火的是从servlet中的HTTPRequest对象获取参数:
- 我认为你是对的,我应该从源头上控制它。
- 我也这么认为,因为这种技术可以避免发送对象或空值,如果是空值或"for strings",则无需任何理由。
我认为这里有两个问题:一个是你必须检查null值,我完全同意这是愚蠢的。问题是EDCOX1 0是一种原生的Java语言,所以使它稍微好一点的唯一方法是使用像Steve P和TieTyt所提到的方法。然而,还有另一种方法可以通过从不使用空值来处理它。当然,您不能完全避免它,但至少在您自己的代码中,您应该消除所有null引用。有一些很好的论据我不会在这里讨论,但你可以阅读回避!=空语句了解更多详细信息。
如果您感兴趣的是基于Java的语言,斯卡拉已经通过实现一个选项类来很好地开发这个选项类,该类可以判断一个值是否存在(等于EDCOX1的0值)。关于它的好博客帖子:http://jim-mcbeath.blogspot.fr/2008/10/avoising-nulls.html
在(大部分)将空问题存储起来之后,下一个问题将是在使用集合时检查isEmpty或类似的问题。就像你说的,这是屁股疼。但我发现这些支票在很大程度上是可以避免的。当然,这完全取决于您需要对集合做什么,但在大多数情况下,集合在某种程度上用于遍历或操作。使用Java中的Frach循环将确保在集合中什么都不执行时不执行任何操作。整洁的
在某些情况下,集合不能为空。但是,其中一些可以通过良好的设计(例如允许空列表的设计,确保没有列表是空的等等)来避免,但是对于其余的列表来说,根本就没有办法。曾经。但是,在消除了空检查之后,不时地调用一些isEmpty并不是那么糟糕:—)
希望有帮助。
解决这个问题的最简单方法是使用collectionUtils.isEmpty。
Returns: true if empty or null
号
这样就可以在一行中完成。
当涉及到"属性"时,有一些设计模式可以帮助实现这一点。或者,您可以使用guava的可选类。你可以在这里读到更多:瓜娃选修课有什么意义?
您可以编写一个函数来检查对象是否为null和/或是否为字符串,是否为""。然后,只要在每次需要检查所有条件时调用该函数即可。使它返回一个布尔值,这样您就可以将它插入到if语句中。
1 2 3 4 5 6 7 8 9 10 11 12 13
| boolean check (Object o )
{
if (o != null)
{
if (o instanceof String)
{
if (((String) o ). equals(""))
return false;
}
return true;
}
return false;
} |
请参阅评论中的RCOOK建议,以更好地实现这一点。
- 但我不能为我在应用程序中使用的每个类编写函数。
- 检查我的编辑。它适用于所有对象(所有定义的类都隐式扩展对象)。如果对特定对象(字符串除外)有任何其他特殊情况,可以将它们插入函数中。
- 不使用InstanceOf,而是有一个方法用于对象,一个方法用于字符串。让编译器决定调用哪个函数并保存运行时的if语句…Boolean IsEmpty(对象o)返回(o==null);(集合需要一些额外的内容)