按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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