findbugs-dea

假设该组开发人员在大型项目的各个部分上并行工作-一些开发人员在进行服务实现,而其他开发人员在使用该服务的代码。 考虑到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为nonnull参数传递
可能的空指针取消引用

类似地,例如,编写服务代码的人可以对照定义的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-dea

findbugs-dea_FindBugs和JSR-305相关推荐

  1. FindBugs和JSR-305

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 英特尔近日发布最新版实感™ SDK R5 (v7)
  2. lingo 嵌套@for或嵌套@sum
  3. 解决vue中对象属性改变视图不更新的问题
  4. 微服务部署HTTP反向代理、负载均衡工具Træfɪk
  5. Caffe2:段错误(核心 已转储)
  6. 为什么滴滴天猫都玩上了大数据“杀熟”的套路?
  7. H5 data-* 属性,设置获取方法总结
  8. seqlist插入java_线性表插入c语言代码我想问的是seqlist *l中的*l不是太理解。它指向了哪里...
  9. 将两个PCB文件合并成一个文件
  10. Could not resolve dependencies for project
  11. Rss Feed是什么
  12. “次世代”游戏建模技术真的那么火吗?那容易学会吗?如何去学?
  13. 利用spring的jdbcTemplate处理blob、clob
  14. linux嵌入式在线升级,嵌入式linux Kernel 在线升级参考资料
  15. Rasa课程、Rasa培训、Rasa面试系列之 Rasa对话式 AI 网络研讨会回顾
  16. 虚拟机centos安装web服务器
  17. go 发送nats消息提示no response from stream
  18. linux_安装启动talnet相关问题
  19. 在WIN7中用maven将spring boot项目远程部署到Linux虚拟机的docker容器
  20. 数据相关的在职研究生_大数据在职研究生都学什么?

热门文章

  1. 你可能不知道的 10 条 SQL 技巧
  2. 你,下周可否“报上有名”?
  3. 银行营业网点管理系统——dao包(BranchesDao)
  4. Ajax前后端对接---Springmvc
  5. [译] RESTful API 设计最佳实践
  6. 下载的c语言程序代码怎么运行,CFree怎么运行程序 编译运行C语言程序代码的方法...
  7. 小微企业名录查询系统_欢迎访问辽宁小微企业名录系统
  8. 不同特权级间代码段的跳转{ 门 + 跳转(jmp + call) + 返回(ret) }
  9. 构造函数调用默认构造函数_显式无参数构造函数与默认构造函数
  10. java 常规类的可见性_Java 12常规可用性