当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:12:00  来源:本站整理

诊断Java代码::Split Cleaner错误情势[Java编程]

赞助商链接



  本文“诊断Java代码::Split Cleaner错误情势[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

Java 编程语言的一个特点是存储自动管理,它把程序员从很简单出错的释放利用后的内存的工作中约束出来.固然如此,很多程序还是得处理资源问题,比方文件和数据库衔接,这些都必须在利用之后明确地释放掉.跟手工管理存储一样,程序员在手工管理资源时也会犯很多错误.此中一个就是本周专栏的主题 ― Split Cleaner错误情势.

脱离还是不脱离

在管理诸如文件和数据库衔接这样的资源时,您必须在利用完资源后把它释放掉.当然,对代码的任何指定的履行,您但愿一次得到资源,然后一次将其释放.要做到这点,您可以采取两种方法:

您可以在同一个办法中得到并释放资源.用这种方法,可以保证资源每得到一次,也释放一次.

您可以跟踪代码的每一个大概的履行途径,并确保在每一个实例中资源最后都被释放掉了.

第二种方法大概会出问题.因为您的代码库不可避免地要变大,另一个不熟习您代码的程序员大概会增添一条没把资源释放掉的履行途径,后来果当然是资源泄露.

Split Cleaner 错误情势

我把符合这种情势的错误称为 split cleaner,是因为释放资源的代码是沿各种大概的履行途径脱离的.因为沿各条途径的释放代码极大概都是一样的,所以大大都 split cleaner 也是 rogue tile的例子.(Rogue tile 是我对一种错误的称谓,这种错误的起因是:起先用拷贝和粘贴的方法编写代码,但后来在做了一些更改后却忘了适本地改正代码的全部副本.如想更多理解 rogue tile,请参阅我的论文“ 错误情势:介绍.”)

比方,假定您正用 JDBC 处理一张员工姓名表.您但愿履行的很多操作中包含遍历这张表并对此中包含的数据举行计算.您要完成的最后一个操作大概是打印出全部员工的名字,以下所示:

清单 1. 遍历一个员工表的代码

import java.sql.*;
public class Example {
   public static void main(String[] args) {
   String url = "your database url";
   try {
     Connection con = DriverManager.getConnection(url);
     new TablePrinter(con, "Names").walk();
   }
   catch (SQLException e) {
     throw new RuntimeException(e.toString());
   }
   }
}
abstract class TableWalker {

   Connection con;
   String tableName;
   public TableWalker(Connection _con, String _tableName) {
   this.con = _con;
   this.tableName = _tableName;
   }
   public void walk() throws SQLException {
   String queryString =("SELECT * FROM " + tableName);
   Statement stmt = con.createStatement();
   ResultSet rs = stmt.executeQuery(queryString);

   while (rs.next()) {
     execute(rs);
   }
   con.close();
   }
   public abstract void execute(ResultSet rs) throws SQLException;
}
class TablePrinter extends TableWalker {

   public TablePrinter(Connection _con, String _tableName) {
   super(_con, _tableName);
   }
   public void execute(ResultSet rs) throws SQLException {
   String s = rs.getString("FIRST_NAME");
   System.out.println(s);
   }

}

先说点题外话.请注意,我已把用来遍历表的代码抽出来放到了抽象类 Walker 中,以使新的子类可以很简单地遍历表中的行.固然试图猜测程序被扩大的各种方法并为其编写代码普通是浪费时间,但还是让我们假定在此例中 绝对地,毫无疑问地,无论若何对代码只做这一类的扩大.(事实上,我可以保证在本文完毕前,只会有这样一种扩大).


  以上是“诊断Java代码::Split Cleaner错误情势[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 诊断Java代码 - 筹划"可测试的"操纵程序
  • <b>诊断Java代码: 臆想实现错误情势,第2部份</b>
  • 诊断Java代码: 筹划可扩大的操纵程序,第2部份
  • 诊断Java代码::Split Cleaner错误情势
  • 诊断Java代码: Fictitious Implementation错误情势,第1部份
  • 诊断Java代码:筹划可扩大的操纵程序,第1部份
  • 诊断Java代码:孤线程(Orphaned Thread)错误情势
  • 诊断Java代码
  • 诊断Java代码: 单元测试与自动化代码解析协同工作
  • 诊断Java代码: Repl供应交互式评价
  • 诊断Java代码: Liar View错误情势
  • 诊断Java代码: Java编程中的断言和时态逻辑
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .