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

构建器[Java编程]

赞助商链接



  本文“构建器[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
为违例编写代码时,我们常常要办理的一个问题是:“一旦产生违例,会精确地举行排除吗?”大大都时刻城市非常安全,但在构建器中倒是一个大问题.构建器将对象置于一个安全的起始状况,但它大概履行一些操作——如翻开一个文件.除非用户完成对象的利用,并调用一个特别的排除办法,不然那些操作不会得到精确的排除.若从一个构建器内部“掷”出一个违例,这些排除行为也大概不会精确地发生.全部这些都意味着在编写构建器时,我们必须分外加以留神.
由于前面刚学了finally,所以大家大概认为它是一种符合的筹划.但事情并没有这么简单,因为finally每次城市履行排除代码——即便我们在排除办法运行之前不想履行排除代码.因此,假定真的用finally举行排除,必须在构建器正常完毕时设置某种情势的标志.并且只要设置了标志,就不要履行finally块内的任何东西.由于这种做法并不完善(需求将一个地方的代码同另一个地方的结合起来),所以除非分外需求,不然普通不要尝试在finally中举行这种情势的排除.
在下面这个例子里,我们成立了一个名为InputFile的类.它的作用是翻开一个文件,然后每次读取它的一行内容(转换为一个字串).它操纵了由Java尺度IO库供应的FileReader以及BufferedReader类(将于第10章谈论).这两个类都非常简单,大家目前可以毫无艰难地掌握它们的基本用法:
//: Cleanup.java
// Paying attention to exceptions
// in constructors
import java.io.*;

class InputFile {
  private BufferedReader in;
  InputFile(String fname) throws Exception {
    try {
      in = 
        new BufferedReader(
          new FileReader(fname));
      // Other code that might throw exceptions
    } catch(FileNotFoundException e) {
      System.out.println(
        "Could not open " + fname);
      // Wasn't open, so don't close it
      throw e;
    } catch(Exception e) {
      // All other exceptions must close it
      try {
        in.close();
      } catch(IOException e2) {
        System.out.println(
          "in.close() unsuccessful");
      }
      throw e;
    } finally {
      // Don't close it here!!!
    }
  }
  String getLine() {
    String s;
    try {
      s = in.readLine();
    } catch(IOException e) {
      System.out.println(
        "readLine() unsuccessful");
      s = "failed";
    }
    return s;
  }
  void cleanup() {
    try {
      in.close();
    } catch(IOException e2) {
      System.out.println(
        "in.close() unsuccessful");
    }
  }
}

public class Cleanup {
  public static void main(String[] args) {
    try {
      InputFile in = 
        new InputFile("Cleanup.java");
      String s;
      int i = 1;
      while((s = in.getLine()) != null)
        System.out.println(""+ i++ + ": " + s);
      in.cleanup();
    } catch(Exception e) {
      System.out.println(
        "Caught in main, e.printStackTrace()");
      e.printStackTrace();
    }
  }
} ///:~

该例利用了Java 1.1 IO类.
用于InputFile的构建器采取了一个String(字串)参数,它代表我们想翻开的那个文件的名字.在一个try块内部,它用该文件名成立了一个FileReader.对FileReader来说,除非转移并用它成立一个可以实际与之“扳谈”的BufferedReader,不然便没什么用处.注意InputFile的一个好处就是它同时归并了这两种行动.
若FileReader构建器不成功,就会产生一个FileNotFoundException(文件未找到违例).必须单独捕捉这个违例——这属于我们不想关闭文件的一种特别情形,因为文件还没有成功翻开.其他任何捕捉从句(catch)都必须关闭文件,因为文件已在进入那些捕捉从句时翻开(当然,假如多个办法都能产生一个FileNotFoundException违例,就需求略微用一些本领.此时,我们可将差别的情形脱离到数个try块内).close()办法会掷出一个尝试过的违例.即便它在另一个catch从句的代码块内,该违例也会得以捕捉——对Java编译器来说,那个catch从句不过是另一对花括号罢了.履行完本地操作后,违例会被重新“掷”出.这样做是必要的,因为这个构建器的履行已经失利,我们不但愿调用办法来假定对象已精确成立以及有效.
在这个例子中,没有采取前述的标志技术,finally从句明显不是关闭文件的精确地方,因为这大概在每次构建器完毕的时刻关闭它.由于我们但愿文件在InputFile对象处于活动状况时一向保持翻开状况,所以这样做并不得当.
getLine()办法会返回一个字串,此中包含了文件中下一行的内容.它调用了readLine(),后者大概产生一个违例,但那个违例会被捕捉,使getLine()不会再产生任何违例.对违例来说,一项分外的计划问题是决意在这一级完好掌握一个违例,还是举行部份掌握,并传送相同(或差别)的违例,大概只是简单地传送它.在得当的时刻,简单地传送可极大简化我们的编码工作.getLine()办法会变成:
String getLine() throws IOException {
return in.readLine();
}
但是当然,调用者目前需求对大概产生的任何IOException举行掌握.
用户利用完毕InputFile对象后,必须调用cleanup()办法,以便释放由BufferedReader以及/大概FileReader占用的系统资源(如文件句柄)——注释⑥.除非InputFile对象利用完毕,并且到了需求弃之不用的时刻,不然不该举行排除.大家大概想把这样的机制置入一个finalize()办法内,但正如第4章指出的那样,并非总能保证finalize()得到精确的调用(即便肯定它会调用,也不知道什么时刻开始).这属于Java的一项缺陷——除内存排除之外的全部排除都不会自动举行,所以必须知会客户程序员,奉告他们有责任用finalize()保证排除工作的精确举行.

⑥:在C++里,“破坏器”可帮我们掌握这一局面.

在Cleanup.java中,我们成立了一个InputFile,用它翻开用于成立程序的相同的源文件.同时一次读取该文件的一行内容,并且增添呼应的行号.全部违例城市在main()中被捕捉——固然我们可挑选更大的坚固性.
这个示例也向大家展示了为安在本书的这个地方引入违例的概念.违例与Java的编程具有很高的集成度,这主如果由于编译器会强迫它们.只有知道了若何操作那些违例,才可更进一步地掌握编译器的知识.
  以上是“构建器[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • Java学习笔记-02碰到多个构造器参数时要考虑用构建器
  • 构建器的调用次序
  • 默许构建器
  • java构建器初始化
  • <b>由构建器保证初始化</b>
  • 副本构建器
  • 构建器
  • 构建器内部的多形性办法的行为
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

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

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