假设那组开发人员在大型项目的各个部分上并行工作–一些开发人员在进行服务实现,而其他开发人员在使用该服务的代码。 考虑到API的假设,两个小组都同意服务API,并开始单独工作。

您认为这个故事会有幸福的结局吗? 好吧,…–也许是:) –有一些工具可以帮助实现它:) –其中之一是FindBugs ,它受JSR-305(用于软件缺陷检测的注释)支持。

让我们看一下服务API合同:

package com.blogspot.vardlokkur.services;import java.util.List;import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;import com.blogspot.vardlokkur.entities.domain.Employer;/*** Defines the API contract for the employer service.** @author Warlock* @since 1.0*/
public interface EmployerService {/*** @param identifier the employer's identifier* @return the employer having specified {@code identifier}, {@code null} if not found*/@CheckForNull Employer withId(@Nonnull Long identifier);/*** @param specification defines which employers should be returned* @return the list of employers matching specification*/@Nonnull List thatAre(@Nonnull Specification specification);}

如您所见,在服务方法签名中添加了诸如@ Nonnull或@ CheckForNull之类的注释。 使用它们的目的是定义方法参数的要求(例如, 标识符参数不能为null ),以及方法返回的值的期望值(例如,服务方法的结果可以为null ,应在代码中检查一下) )。

所以呢? –您可能会问–我应该自己检查代码还是让同事相信他们会使用这些注释定义的准则? 当然不是:) –不信任任何人,请使用可验证API假设的工具,例如FindBugs 。

假设我们有以下服务API用法:

package com.blogspot.vardlokkur.test;import org.junit.Before;
import org.junit.Test;import com.blogspot.vardlokkur.services.EmployerService;
import com.blogspot.vardlokkur.services.impl.DefaultEmployerService;/*** Employer service test.** @author Warlock* @since 1.0*/
public class EmployerServiceTest {private EmployerService employers;@Beforepublic void before() {employers = new DefaultEmployerService();}@Testpublic void test01() {Long identifier = null;employers.withId(identifier);}@Testpublic void test02() {employers.withId(Long.valueOf(1L)).getBusinessName();}@Testpublic void test03() {employers.thatAre(null);}
}

让我们尝试根据服务API假设来​​验证代码:

FindBugs将分析您的代码,并切换到显示潜在问题的FindBugs透视图:

为null参数传递了null
可能的空指针取消引用

类似地,例如,编写服务代码的人可以对照定义的API假设来​​验证其工作。 如果您为服务实现的早期版本运行FindBugs :

package com.blogspot.vardlokkur.services.impl;import java.util.List;import com.blogspot.vardlokkur.entities.domain.Employer;
import com.blogspot.vardlokkur.services.EmployerService;
import com.blogspot.vardlokkur.services.Specification;/*** Default implementation of {@link EmployerService}.** @author Warlock* @since 1.0*/
public class DefaultEmployerService implements EmployerService {/*** {@inheritDoc}*/public Employer withId(Long identifier) {return null;}/*** {@inheritDoc}*/public List thatAre(Specification specification) {return null;}}

将发现以下错误:

如您所见,FindBugs和他的盟友-JSR-305没有什么可以隐藏的;)

甜点的几个链接:

  • JSR-305:软件缺陷检测的批注
  • JSR 305:一颗子弹还是根本没有?

参考: JCG合作伙伴提供的 FindBugs和JSR-305   Micha? 术士思想博客上的Ja?tak。

翻译自: https://www.javacodegeeks.com/2012/03/findbugs-and-jsr-305.html

FindBugs和JSR-305相关推荐

  1. 如何优雅地根治null值引起的Bug!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:https://lrwinx.github.io  写在前面 ...

  2. Java:如何更优雅的处理空值?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:lrwinx https://lrwinx.github.i ...

  3. swing查询输入框无值时出现null异常_如何优雅处理代码中 Null 值引起的 Bug?告别 Null 恐惧症!...

    导语 在笔者几年的开发经验中,经常看到项目中存在到处空值判断的情况,这些判断,会让人觉得摸不这头绪,它的出现很有可能和当前的业务逻辑并没有关系.但它会让你很头疼. 有时候,更可怕的是系统因为这些空值的 ...

  4. 老大难的空指针,如何优雅处理?

    作者:Lrwin http://lrwinx.github.io/2018/08/30/java匠人手法-优雅的处理空值 导语 在笔者几年的开发经验中,经常看到项目中存在到处空值判断的情况,这些判断, ...

  5. Java项目中如何更优雅的处理空值?

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 来源:https://lrw ...

  6. 一个空值_java匠人手法优雅的处理空值

    点击上方☝SpringForAll社区 轻松关注!及时获取有趣有料的技术文章 来源: http://lrwinx.github.io/2018/08/30/java匠人手法-优雅的处理空值/ 导语 在 ...

  7. 关于Java空指针的控制(转)

    1)在已经的String(字符串)调用 equal()和 equalsingnoreCase()而不是未知的对象 通常在已经的非空字符串在调用equals().因为equal()方法是对称的,调用a. ...

  8. 后端:Java中如何更优雅的处理空值,看完你就懂了!

    导语 在笔者几年的开发经验中,经常看到项目中存在到处空值判断的情况,这些判断,会让人觉得摸不着头绪,它的出现很有可能和当前的业务逻辑并没有关系.但它会让你很头疼. 有时候,更可怕的是系统因为这些空值的 ...

  9. java 迁移数据_Java 9迁移指南:七个最常见的挑战

    java 迁移数据 我敢肯定,您已经听说过更新到Java 9并不是一件容易的事,甚至可能是不兼容的更新,而且对于大型代码库而言,迁移毫无意义. 这样做之后,我迁移了一个相当大的旧代码库,我可以告诉你, ...

最新文章

  1. memset函数及其用法,C语言memset函数详解
  2. 160个Crackme006
  3. 一个账号可以登录几台机器_干货:一个PubMed账号可以有这么多用处!
  4. modsecurity(尚不完善)
  5. java 记账系统_案例分享用java开发实现一个记账系统(代码全)
  6. 好程序员分享大数据入门教程:Hadoop和spark的性能比较
  7. [全国十大城市火车票售票点、订票电话(买票再也不用去火车站排队)] – [旅游] – [校内论坛]
  8. 备战数学建模36-时间序列模型2
  9. 揭晓网站建设对于企业发展的重要作用
  10. blos硬盘启动台式计算机,戴尔台式机bios设置硬盘启动教程--系统之家
  11. 题目 1097: 蛇行矩阵 题解
  12. 计算机术语横幅迎新,内蒙古师范大学用代码写迎新条幅,还有哪些搞笑的迎新标语?...
  13. 万字面试分享贴!从十二个角度解析面试全流程!附互联网公司Offer难度系数分析...
  14. 深度学习_07_2_随机梯度下降_激活函数及梯度损失函数及梯度
  15. java for 字母金字塔_扣丁学堂Java培训简述如何用C#随机数生成字母金字塔
  16. hadoop学习笔记4:java实现hdfs -ls/-lsr
  17. 【深度学习】数据扩充 (Data Augmentation)
  18. 前端:Tomcat服务器部署Web项目
  19. 苹果Mac如何优化电池续航能力?
  20. Could not find setter for ID on class com.iflytek.civilAffairs.pojo.MzywShswcYtwy

热门文章

  1. spring react_使用Spring Cloud Gateway保护React式微服务
  2. java多功能钟_Java 11将包含更多功能
  3. liskov替换原则_坚实原则:Liskov替代原则
  4. 运行单个源文件_使用一个命令执行单个Java源文件
  5. sap界面功能_功能介面
  6. java 开发人员工具_Java开发人员的5种工具
  7. 基于Spring Boot Profile的日志记录示例样本
  8. Java 8:长期支持的堡垒
  9. Apache Fluo:填充Google搜索索引的Percolator的实现
  10. Java命令行界面(第1部分):Apache Commons CLI