仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1190|回复: 19
打印 上一主题 下一主题

[学习教程] 发布一篇构建器

[复制链接]
深爱那片海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:36:04 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
你总不能说你写框架吧,那无疑会加大工作量,现在大多企业采取的是折中的办法,就是改别人写好的框架,可要改框架,前提是你对这个框架足够的了解,这就更难了。
为背例编写代码时,我们常常要办理的一个成绩是:“一旦发生背例,会准确地举行扫除吗?”年夜多半时分城市十分平安,但在构建器中倒是一个年夜成绩。构建器将对象置于一个平安的肇端形态,但它大概实行一些操纵——如翻开一个文件。除非用户完成对象的利用,并挪用一个特别的扫除办法,不然那些操纵不会失掉准确的扫除。若从一个构建器外部“掷”出一个背例,这些扫除举动也大概不会准确地产生。一切这些都意味着在编写构建器时,我们必需出格加以寄望。
因为后面刚学了finally,以是人人大概以为它是一种符合的计划。但事变并没有这么复杂,由于finally每次城市实行扫除代码——即便我们在扫除办法运转之前不想实行扫除代码。因而,假设真的用finally举行扫除,必需在构建器一般停止时设置某种情势的标记。并且只需设置了标记,就不要实行finally块内的任何工具。因为这类做法其实不完善(必要将一个中央的代码同另外一个中央的分离起来),以是除非出格必要,不然一样平常不要实验在finally中举行这类情势的扫除。
鄙人面这个例子里,我们创立了一个名为InputFile的类。它的感化是翻开一个文件,然后每次读取它的一行内容(转换为一个字串)。它使用了由Java尺度IO库供应的FileReader和BufferedReader类(将于第10章会商)。这两个类都十分复杂,人人如今能够毫无坚苦地把握它们的基础用法:
  1. //:Cleanup.java
  2. //Payingattentiontoexceptions
  3. //inconstructors
  4. importjava.io.*;
  5. classInputFile{
  6. privateBufferedReaderin;
  7. InputFile(Stringfname)throwsException{
  8. try{
  9. in=
  10. newBufferedReader(
  11. newFileReader(fname));
  12. //Othercodethatmightthrowexceptions
  13. }catch(FileNotFoundExceptione){
  14. System.out.println(
  15. "Couldnotopen"+fname);
  16. //Wasntopen,sodontcloseit
  17. throwe;
  18. }catch(Exceptione){
  19. //Allotherexceptionsmustcloseit
  20. try{
  21. in.close();
  22. }catch(IOExceptione2){
  23. System.out.println(
  24. "in.close()unsuccessful");
  25. }
  26. throwe;
  27. }finally{
  28. //Dontcloseithere!!!
  29. }
  30. }
  31. StringgetLine(){
  32. Strings;
  33. try{
  34. s=in.readLine();
  35. }catch(IOExceptione){
  36. System.out.println(
  37. "readLine()unsuccessful");
  38. s="failed";
  39. }
  40. returns;
  41. }
  42. voidcleanup(){
  43. try{
  44. in.close();
  45. }catch(IOExceptione2){
  46. System.out.println(
  47. "in.close()unsuccessful");
  48. }
  49. }
  50. }
  51. publicclassCleanup{
  52. publicstaticvoidmain(String[]args){
  53. try{
  54. InputFilein=
  55. newInputFile("Cleanup.java");
  56. Strings;
  57. inti=1;
  58. while((s=in.getLine())!=null)
  59. System.out.println(""+i+++":"+s);
  60. in.cleanup();
  61. }catch(Exceptione){
  62. System.out.println(
  63. "Caughtinmain,e.printStackTrace()");
  64. e.printStackTrace();
  65. }
  66. }
  67. }///:~
复制代码
该例利用了Java1.1IO类。
用于InputFile的构建器接纳了一个String(字串)参数,它代表我们想翻开的谁人文件的名字。在一个try块外部,它用该文件名创立了一个FileReader。对FileReader来讲,除非转移并用它创立一个可以实践与之“扳谈”的BufferedReader,不然便没甚么用途。注重InputFile的一个优点就是它同时兼并了这两种举动。
若FileReader构建器不乐成,就会发生一个FileNotFoundException(文件未找到背例)。必需独自捕捉这个背例——这属于我们不想封闭文件的一种特别情形,由于文件还没有乐成翻开。其他任何捕捉从句(catch)都必需封闭文件,由于文件已在进进那些捕捉从句时翻开(固然,假如多个办法都能发生一个FileNotFoundException背例,就必要略微用一些技能。此时,我们可将分歧的情形分开到数个try块内)。close()办法会掷出一个实验过的背例。即便它在另外一个catch从句的代码块内,该背例也会得以捕捉——对Java编译器来讲,谁人catch从句不外是另外一对花括号罢了。实行完当地操纵后,背例会被从头“掷”出。如许做是需要的,由于这个构建器的实行已失利,我们不但愿挪用办法来假定对象已准确创立和无效。
在这个例子中,没有接纳前述的标记手艺,finally从句明显不是封闭文件的准确中央,由于这大概在每次构建器停止的时分封闭它。因为我们但愿文件在InputFile对象处于举动形态时一向坚持翻开形态,以是如许做其实不得当。
getLine()办法会前往一个字串,个中包括了文件中下一行的内容。它挪用了readLine(),后者大概发生一个背例,但谁人背例会被捕捉,使getLine()不会再发生任何背例。对背例来讲,一项出格的计划成绩是决意在这一级完整把持一个背例,仍是举行部分把持,并传送不异(或分歧)的背例,大概只是复杂地传送它。在得当的时分,复杂地传送可极年夜简化我们的编码事情。getLine()办法会酿成:
StringgetLine()throwsIOException{
returnin.readLine();
}
可是固然,挪用者如今必要对大概发生的任何IOException举行把持。
用户利用终了InputFile对象后,必需挪用cleanup()办法,以便开释由BufferedReader和/大概FileReader占用的体系资本(如文件句柄)——正文⑥。除非InputFile对象利用终了,并且到了必要弃之不必的时分,不然不该举行扫除。人人大概想把如许的机制置进一个finalize()办法内,但正如第4章指出的那样,并不是总能包管finalize()取得准确的挪用(即使断定它会挪用,也不晓得什么时候入手下手)。这属于Java的一项缺点——除内存扫除以外的一切扫除都不会主动举行,以是必需知会客户程序员,告知他们有义务用finalize()包管扫除事情的准确举行。

⑥:在C++里,“损坏器”可帮我们把持这一场合排场。

在Cleanup.java中,我们创立了一个InputFile,用它翻开用于创立程序的不异的源文件。同时一次读取该文件的一行内容,并且增加响应的行号。一切背例城市在main()中被捕捉——只管我们可选择更年夜的牢靠性。
这个示例也向人人展现了为什么在本书的这个中央引进背例的观点。背例与Java的编程具有很高的集成度,这次要是因为编译器会强迫它们。只要晓得了怎样操纵那些背例,才可更进一步地把握编译器的常识。
j2EE和asp比较,其实也没什么比的,原因和我上面说那些比较差不了多少,也是稳定性,安全性,J2EE比asp高,速度上比不过asp,asp也是延续着它的拖拽控件的方法,提高速度。
深爱那片海 该用户已被删除
沙发
 楼主| 发表于 2015-2-22 20:15:33 | 显示全部楼层
是一种使网页(Web Page)产生生动活泼画面的语言
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-23 18:38

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表