FindBugs和JSR-305

假设那组开发人员在大型项目的各个部分上并行工作–一些开发人员在进行服务实现,而其他开发人员在使用该服务的代码。 考虑到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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java使用org.apache.poi读取与保存EXCEL文件

一、读EXCEL文件 1 package com.ruijie.wis.cloud.utils;2 3 import java.io.FileInputStream;4 import java.io.FileNotFoundException;5 import java.io.IOException;6 import java.io.InputStream;7 import java.text.DecimalFormat;8 import java.util.ArrayList;9 import …

oracle 指定格式化,Oracle中的格式化函数

格式化函数提供一套有效的工具用于把各种数据类型(日期/时间,int,float,numeric)转换成格式化的字符串以及反过来从格式化的字符串转换成原始的数据类型。表 5-6. 格式化函数函数返回描述例子to_char(datetime, text)text把datetime 转换成 s…

弹性数组

看这个结构体的定义:typedef struct st_type{ int nCnt; int item[0];}type_a;(有些编译器会报错无法编译可以改成:)typedef struct st_type{ int nCnt; int item[];}type_a; 这样我们就可以定义一个可变长的结…

什么是Akka?

在深入研究什么是Akka之前,让我们退后一步来了解并发编程的概念在应用程序开发世界中是如何演变的。 应用程序已经从大型的整体程序演变为面向对象的模型。 随着Java EE和Spring框架的出现,应用程序设计演变为更多的基于流程或任务的设计模型。 EJB或Poj…

apache2服务器搭建心得

网站的配置文件在/etc/apache2/sites-avalible中,每个文件对应一个虚拟站点,但需要在/etc/apache2/sites-enabled中创建软链接到sites-avalible中对应的文件。 起初我在sites-avalible中创建了两个站点,一个netaddi.com,一个test.…

has_a php,PHP has encountered a Stack overflow问题解决方法

昨晚将一个disucz论坛进行转移后,发现打开的页面上回多一个PHP has encountered a Stack overflow 这个提示错误,进过翻译为“PHP遇到堆栈溢出”。我就感觉奇怪了,新站没人访问的,怎么可能会溢出。 好吧去discuz官方论坛找找解决方…

解决ueditor jquery javascript 取值问题

代码如下: var content UE.getEditor(myEditor).getContent();myEditor是ueditor 的名称name。代码如下: <textarea name"myEditor" id"myEditor"></textarea><script type"text/javascript">var editor new UE.ui.Editor()…

异常处理准则和最佳实践

让我们回顾一些从对象设计总结的基本异常设计准则&#xff1a;角色&#xff0c;职责和协作&#xff08;Rebecca Wirfs-Brock和Alan McKean&#xff0c;Addison-Wesley&#xff0c;2003年&#xff09;。 不要尝试处理编码错误。 除非在错误情况下要求您的软件采取特殊措施&…

HDU 5225 枚举

题目链接&#xff1a; hdu:http://acm.hdu.edu.cn/showproblem.php?pid5225 bc(中文):http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid580&pid1002 题解&#xff1a; 数组a保存输入 考虑当前位i&#xff0c;对于1<j<i&#xff0c;使得x[j]a[…

河南上oracle客户,解决Oracle监听服务报错

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼如果只是本机的访问 sqlplus system/manager这样是没有问题的。但是如果使用 sqlplus system/managerorcl的时候却会报ora-12514的错误。解决方法&#xff1a;1. 打开D:\oracle\product\10.2.0\db_1/network/admin/listener.ora文件…

【BZOJ2073】[POI2004]PRZ 状压DP

【BZOJ2073】[POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的人都不能超过一定的限制. 所以这只队伍过桥时只能分批过,当一组全部过去时,下一组才能接着过. 队…

运行时vs编译时类路径

这确实应该是一个简单的区别&#xff0c;但是我一直在回答有关Stackoverflow的许多类似问题&#xff0c;并且经常有人误解此事。 那么&#xff0c;什么是类路径&#xff1f; 应用程序所需的一组所有类&#xff08;以及带有类的jar&#xff09;的集合。 但是有两个或实际上三个不…

Unity3d 实现顶点动画

在今年GDC上发现一个非常有趣的演讲&#xff0c;叫做Animating With Math&#xff0c;遂实现之&#xff0c;是讲述顶点shader动画的&#xff0c;举了几个经典的例子&#xff0c;但是讲者并没有给代码&#xff0c;而是像虚幻引擎那样的节点&#xff0c;这样更加清楚明了之前博主…

php codeigniter ext,php – 私有服务器上CodeIgniter不正确的系统路径

上传到服务器的codeigniter项目给我以下错误.Your system folder path does not appear to be set correctly. Pleaseopen the following file and correct this: index.php它在当地运作良好在000webhost.com托管.When uploaded to private server of parallels it gives the a…

对于表单的一些想法

表单 <form id"" name"" method"get/post" action""> 其中get提交长度有限制&#xff0c;并且编码后内容在地址栏可见&#xff0c;post与其相反。 </form> 文本输入 文本框<input type"text" id""…

REST端点,可使用Apache Camel进行集成

REST是一种用于组织资源的体系结构样式&#xff0c;当应用于基于HTTP的服务时&#xff0c;REST可以构建无状态的&#xff0c;解耦的&#xff0c;可伸缩的服务。 HTTP方法&#xff0c;HTTP标头和mime类型都允许开发人员实现REST样式。 诸如Jersey和Fuse Services Framework&…

Appium+Python API相关知识了解

首先&#xff0c;要先了解&#xff0c;官方Appium API // https://testerhome.com/topics/3144 刚开始的时候&#xff0c;没有看官方API&#xff0c;然后在网上瞎找学习资料&#xff0c;发现python相关的很少&#xff0c;看了API才知道&#xff0c;就是selenium webdriver的定位…

JSON用于多态Java对象序列化

长期以来&#xff0c;JSON已成为客户端和服务器之间各种数据序列化的事实上的标准。 除其他外&#xff0c;它的优势是简单和易于阅读。 但是&#xff0c;简单起了一些限制&#xff0c;我今天要谈的其中一个限制是&#xff1a;存储和检索多态Java对象。 让我们从一个简单的问题开…

linux 命令分类,常用linux 命令分类整理(篇一)

工作中接触linux时间也不算短了&#xff0c;不同于Windows的图形化操作&#xff0c;使用linux几乎百分之九十五的情况是在命令行下过日子&#xff0c;过去的两年里&#xff0c;零零碎碎整理过一版自己工作中涉及到和学习过的命令(不过常用的只有三十个左右)&#xff0c;思前想后…

考研复习策略

考研复习是一个不容易的过程&#xff0c;有好的策略事半功倍&#xff0c;以我曾经失败的教训和成功的实践给出了我认为不错的策略&#xff0c;只要能做到&#xff0c;我相信一定能考研成功。 院校选择&#xff1a;985院校在选择考研院校是有优势的&#xff0c;院校考虑的因素有…