知识大全 Java中的构建器

Posted 文件

篇首语:学而不思则罔,思而不学则殆。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java中的构建器相关的知识,希望对你有一定的参考价值。

Java中的构建器  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  为违例编写代码时 我们经常要解决的一个问题是 一旦产生违例 会正确地进行清除吗? 大多数时候都会非常安全 但在构建器中却是一个大问题 构建器将对象置于一个安全的起始状态 但它可能执行一些操作——如打开一个文件 除非用户完成对象的使用 并调用一个特殊的清除方法 否则那些操作不会得到正确的清除 若从一个构建器内部 掷 出一个违例 这些清除行为也可能不会正确地发生 所有这些都意味着在编写构建器时 我们必须特别加以留意   由于前面刚学了finally 所以大家可能认为它是一种合适的方案 但事情并没有这么简单 因为finally每次都会执行清除代码——即使我们在清除方法运行之前不想执行清除代码 因此 假如真的用finally进行清除 必须在构建器正常结束时设置某种形式的标志 而且只要设置了标志 就不要执行finally块内的任何东西 由于这种做法并不完美(需要将一个地方的代码同另一个地方的结合起来) 所以除非特别需要 否则一般不要尝试在finally中进行这种形式的清除   在下面这个例子里 我们创建了一个名为InputFile的类 它的作用是打开一个文件 然后每次读取它的一行内容(转换为一个字串) 它利用了由Java标准IO库提供的FileReader以及BufferedReader类(将于第 章讨论) 这两个类都非常简单 大家现在可以毫无困难地掌握它们的基本用法     //: 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 e )       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 e )      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 = ;     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 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()方法内 但正如第 章指出的那样 并非总能保证finalize()获得正确的调用(即便确定它会调用 也不知道何时开始) 这属于Java的一项缺陷——除内存清除之外的所有清除都不会自动进行 所以必须知会客户程序员 告诉他们有责任用finalize()保证清除工作的正确进行     ⑥ 在C++里 破坏器 可帮我们控制这一局面     在Cleanup java中 我们创建了一个InputFile 用它打开用于创建程序的相同的源文件 同时一次读取该文件的一行内容 而且添加相应的行号 所有违例都会在main()中被捕获——尽管我们可选择更大的可靠性   这个示例也向大家展示了为何在本书的这个地方引入违例的概念 违例与Java的编程具有很高的集成度 这主要是由于编译器会强制它们 只有知道了如何操作那些违例 才可更进一步地掌握编译器的知识 cha138/Article/program/Java/JSP/201311/19319

相关参考

知识大全 Java中的枚举器(反复器)

Java中的枚举器(反复器)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在任何集合类中必须通

知识大全 在构建器里调用构建器

    若为一个类写了多个构建器那么经常都需要在一个构建器里调用另一个构建器以避免写重复的代码可用this关键字做到这一点  通常当我们说this的时候都是指这个对象或者当前对象而且它本身会产生当前对

知识大全 默认构建器

    正如早先指出的那样默认构建器是没有自变量的它们的作用是创建一个空对象若创建一个没有构建器的类则编译程序会帮我们自动创建一个默认构建器例如    //:DefaultConstructorjav

知识大全 构建器的调用顺序

  构建器调用的顺序已在第章进行了简要说明但那是在继承和多形性问题引入之前说的话    用于基础类的构建器肯定在一个衍生类的构建器中调用而且逐渐向上链接使每个基础类使用的构建器都能得到调用之所以要这样

知识大全 构建器内部的多形性方法的行为

  构建器调用的分级结构(顺序)为我们带来了一个有趣的问题或者说让我们进入了一种进退两难的局面若当前位于一个构建器的内部同时调用准备构建的那个对象的一个动态绑定方法那么会出现什么情况呢?在原始的方法内

知识大全 构建Java并发模型框架

构建Java并发模型框架  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java的多线程特性为构

知识大全 构建Java并发模型框架

多线程开发的捷径:构建Java并发模型框架  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Jav

知识大全 Java代码构建一个线程池

Java代码构建一个线程池  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本示例程序由三个类构成

知识大全 构建多线程Java应用程序

构建多线程Java应用程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  大多数服务端应用程序都

知识大全 Java学习:线程池的简单构建

Java学习:线程池的简单构建  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  现在服务器端的应用