友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

Java编程思想第4版[中文版](PDF格式)-第258章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




  public Glass(double wt) { super(wt); }  

  public double value() { return val; }  

  public static void value(double newVal) {  

    val = newVal;  

  }  

} ///:~  

  

下面是一种新的Trash 类型:  

  

//: Cardboard。java   

// The Cardboard class with prototyping  

package c16。trash;  

  

public class Cardboard extends Trash {  

  private static double val = 0。23f;  

  public Cardboard(double wt) { super(wt); }  

  public double value() { return val; }  

  public static void value(double newVal) {  

    val = newVal;  

  }  

} ///:~  

可以看出,除构建器以外,这些类根本没有什么特别的地方。  

  

2。 从外部文件中解析出Trash  

与Trash 对象有关的信息将从一个外部文件中读取。针对Trash 的每个方面,文件内列出了所有必要的信 

息——每行都代表一个方面,采用“垃圾(废品)名称:值”的固定格式。例如:  

  

c16。Trash。Glass:54  



                                                                                          600 


…………………………………………………………Page 602……………………………………………………………

c16。Trash。Paper:22  

c16。Trash。Paper:11  

c16。Trash。Glass:17  

c16。Trash。Aluminum:89  

c16。Trash。Paper:88  

c16。Trash。Aluminum:76  

c16。Trash。Cardboard:96  

c16。Trash。Aluminum:25  

c16。Trash。Aluminum:34  

c16。Trash。Glass:11  

c16。Trash。Glass:68  

c16。Trash。Glass:43  

c16。Trash。Aluminum:27  

c16。Trash。Cardboard:44  

c16。Trash。Aluminum:18  

c16。Trash。Paper:91  

c16。Trash。Glass:63  

c16。Trash。Glass:50  

c16。Trash。Glass:80  

c16。Trash。Aluminum:81  

c16。Trash。Cardboard:12  

c16。Trash。Glass:12  

c16。Trash。Glass:54  

c16。Trash。Aluminum:36  

c16。Trash。Aluminum:93  

c16。Trash。Glass:93  

c16。Trash。Paper:80  

c16。Trash。Glass:36  

c16。Trash。Glass:12  

c16。Trash。Glass:60  

c16。Trash。Paper:66  

c16。Trash。Aluminum:36  

c16。Trash。Cardboard:22  

注意在给定类名的时候,类路径必须包含在内,否则就找不到类。  

为解析它,每一行内容都会读入,并用字串方法 indexOf()来建立“:”的一个索引。首先用字串方法 

substring()取出垃圾的类型名称,接着用一个静态方法 Double。valueOf()取得相应的值,并转换成一个 

double值。trim()方法则用于删除字串两头的多余空格。  

Trash 解析器置入单独的文件中,因为本章将不断地用到它。如下所示:  

  

//: ParseTrash。java   

// Open a file and parse its contents into  

// Trash objects; placing each into a Vector  

package c16。trash;  

import java。util。*;  

import java。io。*;  

  

public class ParseTrash {  

  public static void   

  fillBin(String filename; Fillable bin) {  

    try {  

      BufferedReader data =  

        new BufferedReader(  



                                                                                          601 


…………………………………………………………Page 603……………………………………………………………

          new FileReader(filename));  

      String buf;  

      while((buf = data。readLine())!= null) {  

        String type = buf。substring(0;   

          buf。indexOf(':'))。trim();  

        double weight = Double。valueOf(  

          buf。substring(buf。indexOf(':') + 1)  

          。trim())。doubleValue();  

        bin。addTrash(  

          Trash。factory(  

            new Trash。Info(type; weight)));  

      }  

      data。close();  

    } catch(IOException e) {  

      e。printStackTrace();  

    } catch(Exception e) {  

      e。printStackTrace();  

    }  

  }  

  // Special case to handle Vector:  

  public static void   

  fillBin(String filename; Vector bin) {  

    fillBin(filename; new FillableVector(bin));  

  }  

} ///:~  

在RecycleA。java 中,我们用一个Vector 容纳Trash 对象。然而,亦可考虑采用其他集合类型。为做到这一 

点,fillBin()的第一个版本将获取指向一个 Fillable 的句柄。后者是一个接口,用于支持一个名为 

addTrash()的方法:  

  

//: Fillable。java   

// Any object that can be filled with Trash  

package c16。trash;  

  

public interface Fillable {  

  void addTrash(Trash t);  

} ///:~  

支持该接口的所有东西都能伴随fillBin 使用。当然,Vector 并未实现Fillable ,所以它不能工作。由于 

Vector 将在大多数例子中应用,所以最好的做法是添加另一个过载的 fillBin()方法,令其以一个 Vector 作 

为参数。利用一个适配器(Adapter)类,这个Vector 可作为一个 Fillable 对象使用:  

  

//: FillableVector。java   

// Adapter that makes a Vector Fillable  

package c16。trash;  

import java。util。*;  

  

public class FillableVector implements Fillable {  

  private Vector v;  

  public FillableVector(Vector vv) { v = vv; }  

  public void addTrash(Trash t) {  

    v。addElement(t);  

  }  



                                                                                          602 


…………………………………………………………Page 604……………………………………………………………

} ///:~  

可以看到,这个类唯一的任务就是负责将 Fillable 的addTrash()同Vector 的addElement()方法连接起来。 

利用这个类,已过载的 fillBin()方法可在ParseTrash。java 中伴随一个Vector 使用:  

  

  public static void   

  fillBin(String filename; Vector bin) {  

    fillBin(filename; new FillableVector(bin));  

  }  

  

这种方案适用于任何频繁用到的集合类。除此以外,集合类还可提供它自己的适配器类,并实现 Fillable 

 (稍后即可看到,在DynaTrash。java 中)。  

  

3。 原型机制的重复应用  

现在,大家可以看到采用原型技术的、修订过的RecycleA。java 版本了:  

  

//: RecycleAP。java   

// Recycling with RTTI and Prototypes  

package c16。recycleap;  

import c16。trash。*;  

import java。util。*;  

  

public class RecycleAP {  

  public static void main(String'' args) {  

    Vector bin = new Vector();  

    // Fill up the Trash bin:  

    ParseTrash。fillBin(〃Trash。dat〃; bin);  

    Vector   

      glassBin = new Vector();  

      paperBin = new Vector();  

      alBin = new Vector();  

    Enumeration sorter = bin。elements();  

    // Sort the Trash:  

    while(sorter。hasMoreElements()) {  

      Object t = sorter。nextElement();  

      // RTTI to show class membership:  

      if(t instanceof Aluminum)  

        alBin。addElement(t);  

      if(t instanceof Paper)  

        pap
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!