ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:25.13KB ,
资源ID:17572501      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/17572501.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(java内部类的四个应用场景Word文档格式.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

java内部类的四个应用场景Word文档格式.docx

1、init(); 5. /销毁连接池 6. voiddestory();7. /取得一个连接 8. ConnectiongetConn();9. /还有一些其他的功能,这里不再列出 10. 11. public interface Pool extends TimerListener /初始化连接池 public boolean init(); /销毁连接池 public void destory(); /取得一个连接 public Connection getConn(); /还有一些其他的功能,这里不再列出 有了这个功能接口,我们就可以在它的基础上实现数据库连接池的部分功能了。我们首先想到这

2、个数据库连接池类的操作对象应该是由Connection对象组成的一个数组,既然是数组,我们的池在取得Connection的时候,就要对数组元素进行遍历,看看Connection对象是否已经被使用,所以数组里每一个Connection对象都要有一个使用标志。我们再对连接池的功能进行分析,会发现每一个Connection对象还要一个上次访问时间和使用次数。通过上面的分析,我们可以得出,连接池里的数组的元素应该是由对象组成,该对象的类可能如下:classPoolConn privateconn;isUse;longlastAccess;intuseCount;8. public class Pool

3、Conn private Connection conn; private boolean isUse; private long lastAccess; private int useCount;下面的省略号省掉的是关于四个属性的一些get和set方法。我们可以看到这个类的核心就是Connection,其他的一些属性都是Connection的一些标志。可以说这个类只有在连接池这个类里有用,其他地方用不到。这时候,我们就该考虑是不是可以把这个类作为一个内部类呢?而且我们把它作为一个内部类以后,可以把它定义成一个私有类,然后将它的属性公开,这样省掉了那些无谓的get和set方法。下面我们就试试看

4、:ConnectPoolimplementsPool /存在Connection的数组 PoolConnpoolConns;/连接池的最小连接数 min;/连接池的最大连接数 max;/一个连接的最大使用次数 maxUseCount;11. /一个连接的最大空闲时间 12. maxTimeout;13. /同一时间的Connection最大使用个数 14. maxConns;15. /定时器 16. Timertimer;17. init() 18. 19. try20. 21. 22. this.poolConns=newPoolConnthis.min;23. for(inti=0;ith

5、is.min;i+) 24. 25. PoolConnpoolConnPoolConn();26. poolConn.connConnectionManager.getConnection();27. poolConn.isUsefalse;28. poolConn.lastAccessDate().getTime();29. poolConn.useCount0;30. this.poolConnsipoolConn;31. 32. 33. returntrue;34. 35. catch(Exceptione) 36. 37. return38. 39. 40. 41. private42

6、. 43. 44. 45. public46. 47. 48. public class ConnectPool implements Pool /存在Connection的数组 private PoolConn poolConns; /连接池的最小连接数 private int min; /连接池的最大连接数 private int max; /一个连接的最大使用次数 private int maxUseCount; /一个连接的最大空闲时间 private long maxTimeout; /同一时间的Connection最大使用个数 private int maxConns; /定时器

7、private Timer timer; public boolean init() try this.poolConns = new PoolConnthis.min; for(int i=0;i+) PoolConn poolConn = new PoolConn(); poolConn.conn = ConnectionManager.getConnection(); poolConn.isUse = false; poolConn.lastAccess = new Date().getTime(); poolConn.useCount = 0; this.poolConnsi = po

8、olConn;return true; catch(Exception e) return false;private class PoolConn public Connection conn; public boolean isUse;public long lastAccess; public int useCount;因为本文不是专题来讲述数据库连接池的,所以在上面的代码中绝大部分的内容被省略掉了。PoolConn类不大可能被除了ConnectionPool类的其他类使用到,把它作为ConnectionPool的私有内部类不会影响到其他类。同时,我们可以看到,使用了内部类,使得我们可以

9、将该内部类的数据公开,ConnectionPool类可以直接操作PoolConn类的数据成员,避免了因set和get方法带来的麻烦。上面的一个例子,是使用内部类使得你的代码得到简化和方便。还有些情况下,你可能要避免你的类被除了它的外部类以外的类使用到,这时候你却不得不使用内部类来解决问题。场景二:解决一些非面向对象的语句块 这些语句块包括ifelse ifelse语句,case语句,等等。这些语句都不是面向对象的,给我们造成了系统的扩展上的麻烦。我们可以看看,在模式中,有多少模式是用来解决由if语句带来的扩展性的问题。Java编程中还有一个困扰我们的问题,那就是trycatch问题,特别是在J

10、DBC编程过程中。请看下面的代码:1. try2. StringdivisionDatanull;connmanager.getInstance().getConnection();stmt(OracleCallableStatement)conn.prepareCall(CallPM_GET_PRODUCT.HEADER_DIVISION(?,?);stmt.setLong(1,productId.longValue()stmt.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);stmt.execute();ResultSetrss

11、tmt.getCursor(2);i0StringstrDivisionwhile(rs.next() +=rs.getString(DIVISION_ID+,lengthstrDivision.length()if(length!strDivision.substring(0,length-1);StringUtil.split(strDivision,map.put(DivisionLoggerAgent.debug(GetHeaderProcessgetDivisionDatagetValue+productId)catch(ExceptionLoggerAgent.error(GetH

12、eaderData, SQLException:e);e.printStackTrace()finally31. 32. manager.close(stmt);33. manager.releaseConnection(conn);try String divisionData = null; conn = manager.getInstance().getConnection(); stmt = (OracleCallableStatement)conn.prepareCall( Call PM_GET_PRODUCT.HEADER_DIVISION(?, ?) stmt.setLong(

13、1 ,productId.longValue() ); stmt.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR); ; stmt.execute(); ResultSet rs = stmt.getCursor(2); int i = 0 ; String strDivision = while( rs.next() ) strDivision += rs.getString() + int length = strDivision.length() ; if(length != 0 ) strDivision = strDivi

14、sion.substring(0,length - 1); divisionData = StringUtil.split(strDivision, ) ; map.put(, strDivision ) ; LoggerAgent.debug(getValue + + strDivision + + productId) ; catch(Exception e) LoggerAgent.error(, , + e); e.printStackTrace() ; finally manager.close(stmt); manager.releaseConnection(conn);这是我们最

15、最常用的一个JDBC编程的代码示例。一个系统有很多这样的查询方法,这段代码一般分作三段:try关键字括起来的那段是用来做查询操作的,catch关键字括起来的那段需要做两件事,记录出错的原因和事务回滚(如果需要的话),finally关键字括起来的那段用来释放数据库连接。我们的烦恼是:try关键字括起来的那段是变化的,每个方法的一般都不一样。而 catch和finally关键字括起来的那两段却一般都是不变的,每个方法的那两段都是一样的。既然后面那两段是一样的,我们就非常希望将它们提取出来,做一个单独的方法,然后让每一个使用到它们的方法调用。但是,trycatchfinally是一个完整的语句段,不

16、能把它们分开。这样的结果,使得我们不得不在每一个数据层方法里重复的写相同的catchfinally这两段语句。既然不能将那些讨厌的trycatchfinally作为一个公用方法提出去,那么我们还是需要想其他的办法来解决这个问题。不然我们老是写那么重复代码,真是既繁琐,又不容易维护。我们容易想到,既然catchfinally这两段代码不能提出来,那么我们能不能将try里面的代码提出去呢?唉哟,try里面的代码是可变的呢。怎么办?既然try里面的代码是可变的,这意味着这些代码是可扩展的,是应该由用户来实现的,对于这样的可扩展内容,我们很容易想到用接口来定义它们,然后由用户去实现。这样以来我们首先定

17、义一个接口:DataManager manageData();4. public interface DataManager public void manageData();我们需要用户在manageData()方法中实现他们对数据层访问的代码,也就是try里面的代码。然后我们使用一个模板类来实现所有的trycatchfinally语句的功能,如下:public class DataTemplate public void execute(DataManager dm) try dm.manageData(); catch(Exception e) , finally 这样,一个模板类就完成了。我们也通过这个模板类将catchfinally两段代码提出来了。我们来看看使用了这个模板类的数据层方法是怎么实现的:new DataTemplate().execute(new DataManager() public void manageData() while( rs.next() )

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1