“J2EE 最佳实践”代码复审

“J2EE 最佳实践”代码复审仅由一个类别组成;它也被称为“J2EE 最佳实践”。

目的

“J2EE 最佳实践”代码复审应用规则,来在代码中检测出用传统方法很难检测的反模式。反模式是代码中发生的、不遵循最佳实践的已知问题。设计模式是要遵循的好的模型,而反模式则是应避免的不好的模型。这些反模式可能造成严重的性能降低或系统中断。此代码复审仅对 servlet 运行。servlet 必须在动态 Web 项目中,针对以下中的一个桩模块:
  • WebSphere® Application Server 5.0
  • WebSphere Application Server 5.1
  • WebSphere Application Server 6.0
JSP、strut 和 EJB 不受支持。

代码复审中的某些规则要求数据流分析检测出某些发现结果。数据流分析会跟踪发现结果的路径。因此,当应用了那些规则时,将需要花费更长的时间来完成代码复审。

规则类别

下表列出了“J2EE 最佳实践”代码复审中的所有类别和子类别,以及每个类别和子类别中的规则的描述。在左列中,类别使用粗体文本,子类别使用纯文本。

类别或子类别 描述
J2EE 最佳实践 包含的规则基于最佳 J2EE 开发实践并且支持针对 WebSphere 服务器的 Web 项目
正确性 包含的规则用于检测不正确的方法调用
数据竞争 包含的规则用于检测可在 J2EE 应用程序中引起数据竞争状态的方法调用
垃圾回收 包含的规则用于检测可以延迟垃圾回收的方法调用
可维护性 包含的规则用于检测在 J2EE 应用程序中可能很难维护的代码
性能和可伸缩性 包含的规则用于检测防碍 J2EE 应用程序性能或限制 J2EE 应用程序可伸缩性的方法调用
资源管理 包含在 J2EE 应用程序中使用资源的 J2EE 最佳实践规则

规则类型

“J2EE 最佳实践”代码复审应用的规则有两种类型:快速规则和深层规则。区分规则类型的特征是应用规则的时间长短和规则在发现结果中给出的信息类型。

快速 J2EE 规则

在“J2EE 最佳实践”代码复审中应用快速 J2EE 规则比应用深层规则所花的时间要少。快速规则会给出与其它代码复审中的规则相同的发现结果信息。

深层 J2EE 规则

深层 J2EE 规则需要数据流分析,因此需要比快速规则更多的时间来生成发现结果。深层 J2EE 规则不仅产生发现结果,而且还显示通向发现结果的路径。这些规则需要数据流分析(即跟踪路径的方法),因此需要比快速规则更多的时间来生成发现结果。深层规则提供了以下补充信息:

深层 J2EE 规则的列表

有 36 个深层 J2EE 规则。下表的左列列出了这些规则所属的子类别。右列列出或描述了子类别中哪些规则是深层 J2EE 规则。

类别或子类别 深层 J2EE 规则
正确性
避免在 javax.servlet.http.HttpSession 中存储不实现 java.io.Serializable 的对象
数据竞争
避免不使用共享锁定而从 javax.servlet.Service.service() 为任何静态字段赋值
避免不使用共享锁定而从 javax.servlet.Service.service() 为 servlet 实例字段赋值
性能和可伸缩性
始终在 javax.servlet.http.HttpServletRequest.getSession() 之后调用 javax.servlet.http.HttpSession.invalidate()
资源管理 此子类别中的 32 个规则全部都是深层 J2EE 规则。

样本规则

本部分包含在“J2EE 最佳实践”代码复审中应用的每个规则类型的一个样本。

样本快速规则

以下规则是“性能和可伸缩性”子类别中的样本快速规则。

避免从任何 servlet 调用 java.lang.Runtime

样本深层规则

以下规则是“资源管理”子类别中的样本深层规则。
始终在 new java.io.FileInputStream(java.io.File) 之后调用 java.io.FileInputStream.close()

已知问题

本部分记录“J2EE 最佳实践”代码复审的已知问题。

假警报:输入流未结束

摘要:“J2EE 最佳实践”代码复审生成一个输入流未结束的发现结果。事实上,没有其它输入流要结束。

描述:代码复审没有识别在以下情况中所有输入流都已结束:
  • 如果 bis 为 null,那么没有输入流要结束
  • 一个输入流 FileInputStream 被用于创建另一个输入流 BufferedInputStream。当第二个输入流结束时,第一个也结束。
说明:以下代码示例中突出显示的行说明了这两种情况:
public static int readFirstByte(String fileName) {
 int firstByte = -1;
 FileInputStream fis=null;
 BufferedInputStream bis = null;
 try {
  fis = new FileInputStream(fileName);
  bis = new BufferedInputStream(fis);  firstByte = bis.read();
 } catch (FileNotFoundException fnfe) {
  LogUtility.log(fnfe);
 } catch (IOException ioe) {
  LogUtility.log(ioe);
 } finally {
  if (bis!=null){   try {
    bis.close();   } catch (IOException ioe){
    LogUtility.log(ioe);
   }
  }
 }
 return firstByte;
} 

变通方法:右键单击作为假警报的发现结果,然后单击忽略

信息不足:针对某个 .classpath 文件报告了发现结果

摘要:“J2EE 最佳实践”代码复审针对 .classpath 文件(而不是针对工作台中资源)生成了发现结果。

描述:代码复审找到了一个二进制类型的问题,并且该类型在工作台中没有相应的资源,因为它被包含在外部的 JAR 中。

引用:RFE RATLC00038795

变通方法:

  1. 在“代码复审细节”视图中,单击路径选项卡,来查看哪个类型在工作台中没有相应的资源。
  2. 展开路径信息来查看发现结果中涉及的类型名称以及(可能)方法和字段。

资源过滤器:对深层规则不起作用

摘要:在“资源过滤器”页面上,您指定不想在代码复审期间应用选定深层规则的文件。但是,过滤器不起作用,并且规则仍应用于您指定的文件。

描述:当涉及指定不想在代码复审期间应用规则的文件时,深层 J2EE 规则的作用方式不同。深层规则不能识别“资源过滤器”页面上指定的文件,但是能识别出“排除”页面上的文件(缺省情况下该页面上列出 JAR 文件)。这些规则识别两种要排除的文件类型:标准的 servlet 或 JAR 文件,并且忽略所有其它类型。

变通方法:
  1. 单击窗口 > 首选项,打开“首选项”窗口。
  2. 在左窗格中,展开 Java™代码复审,然后选择排除
  3. 在“排除”页面上,复审“资源”页面上列出的文件,并执行以下一项操作:
    • 如果列出了您想要排除的不需深层 J2EE 规则复审的文件,那么请单击确定。您不需要进一步操作。
    • 要排除某个 servlet,使它不需深层 J2EE 规则复审,请选择该 servlet 的 .java 或 .class 文件,然后单击确定
    • 要排除某个 JAR 文件,使它不需深层 J2EE 规则复审,请选择该 JAR 文件,然后单击确定
如果列出了您不想要从代码复审中排除的文件,请选择该文件,然后单击除去
使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.