77.JAVA编程思想——模拟垃圾回收

77.JAVA编程思想——模拟垃圾回收

这个问题的本质是若将垃圾丢进单个垃圾筒,事实上是未经分类的。但在以后,某些特殊的信息必须恢复,以便对垃圾正确地归类。在最开始的解决方案中,RTTI 扮演了关键的角色。这并不是一种普通的设计,因为它增加了一个新的限制。正是这个限制使问题变得非常有趣——它更象我们在工作中碰到的那些非常麻烦的问题。这个额外的限制是:垃圾抵达垃圾回收站时,它们全都是混合在一起的。程序必须为那些垃圾的分类定出一个模型。这正是RTTI 发挥作用的地方:我们有大量不知名的垃圾,程序将正确判断出它们所属的类型。

1     代码

import java.util.*;

import
java.io.*;

abstract
class
Trash {

private
double
weight;

Trash(double
wt) {

weight =
wt;

}

abstract
double
value();

double weight() {

return
weight;

}

// Sums thevalue of Trash in a bin:

static
void
sumValue(Vector
bin) {

Enumeration
e = bin.elements();

double
val = 0.0f;

while (e.hasMoreElements()) {

// One kind of RTTI:

// A dynamically-checked cast

Trash t = (Trash)
e.nextElement();

// Polymorphism in action:

val +=
t.weight() * t.value();

System.out.println("weight of "+

// Using RTTI to get type

// information about the class:

t.getClass().getName() +
" = " + t.weight());

}

System.out.println("Total value = " +
val);

}

}

class Aluminum
extends Trash {

static
double
val= 1.67f;

Aluminum(double
wt) {

super(wt);

}

double value() {

return
val;

}

static
void
value(doublenewval){

val =
newval;

}

}

class Paper
extends Trash {

static
double
val= 0.10f;

Paper(double
wt) {

super(wt);

}

double value() {

return
val;

}

static
void
value(doublenewval){

val =
newval;

}

}

class Glass
extends Trash {

static
double
val= 0.23f;

Glass(double
wt) {

super(wt);

}

double value() {

return
val;

}

static
void
value(doublenewval){

val =
newval;

}

}

public
class
RecycleA {

public
staticvoid
main(String[]
args){

Vector
bin = new Vector();

// Fill up the Trash bin:

for (int
i = 0; i < 30;
i++)

switch ((int) (Math.random() * 3)) {

case 0:

bin.addElement(new Aluminum(Math.random()* 100));

break;

case 1:

bin.addElement(new Paper(Math.random()* 100));

break;

case 2:

bin.addElement(new Glass(Math.random()* 100));

}

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
instanceofAluminum)

alBin.addElement(t);

if (t
instanceofPaper)

paperBin.addElement(t);

if (t
instanceofGlass)

glassBin.addElement(t);

}

Trash.sumValue(alBin);

Trash.sumValue(paperBin);

Trash.sumValue(glassBin);

Trash.sumValue(bin);

}

} /// :~

输出:

weightof Aluminum = 40.532515411743795

weightof Aluminum = 83.38919865473446

weightof Aluminum = 73.84371640964957

weightof Aluminum = 10.474970990053

weightof Aluminum = 13.224867897242598

weightof Aluminum = 22.354321379716012

weightof Aluminum = 34.105686597783915

weightof Aluminum = 19.742978223720296

Totalvalue = 497.1059740184192

weightof Paper = 24.70794232333027

weightof Paper = 2.8129388934932553

weightof Paper = 59.3531424871936

weightof Paper = 51.30414548333662

weightof Paper = 11.990721589197884

weightof Paper = 16.510872726252746

weightof Paper = 25.420046775288142

weightof Paper = 61.07763842376982

weightof Paper = 14.077079318003804

Totalvalue = 26.725453200226895

weightof Glass = 72.73164348253516

weightof Glass = 5.011931780096724

weightof Glass = 29.81602815752583

weightof Glass = 22.072368824629862

weightof Glass = 90.15064650452305

weightof Glass = 75.33577784692417

weightof Glass = 51.91046328199902

weightof Glass = 98.00518661238358

weightof Glass = 93.25291794461366

weightof Glass = 97.80335165495947

weightof Glass = 84.00561113051397

weightof Glass = 95.97658239820241

weightof Glass = 55.76586894783563

Totalvalue = 200.52283070794394

weightof Glass = 72.73164348253516

weightof Paper = 24.70794232333027

weightof Aluminum = 40.532515411743795

weightof Aluminum = 83.38919865473446

weightof Paper = 2.8129388934932553

weightof Paper = 59.3531424871936

weightof Paper = 51.30414548333662

weightof Aluminum = 73.84371640964957

weightof Aluminum = 10.474970990053

weightof Glass = 5.011931780096724

weightof Glass = 29.81602815752583

weightof Aluminum = 13.224867897242598

weightof Glass = 22.072368824629862

weightof Glass = 90.15064650452305

weightof Paper = 11.990721589197884

weightof Glass = 75.33577784692417

weightof Aluminum = 22.354321379716012

weightof Paper = 16.510872726252746

weightof Glass = 51.91046328199902

weightof Glass = 98.00518661238358

weightof Glass = 93.25291794461366

weightof Paper = 25.420046775288142

weightof Glass = 97.80335165495947

weightof Aluminum = 34.105686597783915

weightof Aluminum = 19.742978223720296

weightof Glass = 84.00561113051397

weightof Paper = 61.07763842376982

weightof Paper = 14.077079318003804

weightof Glass = 95.97658239820241

weightof Glass = 55.76586894783563

Totalvalue = 724.35425792659

其中创建了几个Vector 对象,用于容纳Trash 句柄。当然,Vector 实际容纳的是Object(对象),所以它们最终能够容纳任何东西。之所以要它们容纳Trash(或者从Trash 衍生出来的其他东西),唯一的理由是我们需要谨慎地避免放入除Trash 以外的其他任何东西。如果真的把某些“错误”的东西置入Vector,那么不会在编译期得到出错或警告提示——只能通过运行期的一个违例知道自己已经犯了错误。

Trash 句柄加入后,它们会丢失自己的特定标识信息,只会成为简单的Object 句柄(上溯造型)。然而,由于存在多形性的因素,所以在我们通过Enumerationsorter 调用动态绑定方法时,一旦结果Object 已经造型回Trash,仍然会发生正确的行为。sumValue()也用一个Enumeration 对Vector 中的每个对象进行操作。

表面上持,先把Trash 的类型上溯造型到一个集合容纳基础类型的句柄,再回过头重新下溯造型,这似乎是一种非常愚蠢的做法。为什么不只是一开始就将垃圾置入适当的容器里呢?(事实上,这正是拨开“回收”一团迷雾的关键)。在这个程序中,我们很容易就可以换成这种做法,但在某些情况下,系统的结构及灵活性都能从下溯造型中得到极大的好处。该程序已满足了设计的初衷:它能够正常工作!只要这是个一次性的方案,就会显得非常出色。但是,真正有用的程序应该能够在任何时候解决问题。所以必须问自己这样一个问题:“如果情况发生了变化,它还能工作吗?”举个例子来说,厚纸板现在是一种非常有价值的可回收物品,那么如何把它集成到系统中呢(特别是程序很大很复杂的时候)?由于前面在switch
语句中的类型检查编码可能散布于整个程序,所以每次加入一种新类型时,都必须找到所有那些编码。若不慎遗漏一个,编译器除了指出存在一个错误之外,不能再提供任何有价值的帮助。

RTTI 在这里使用不当的关键是“每种类型都进行了测试”。如果由于类型的子集需要特殊的对待,所以只寻找那个子集,那么情况就会变得好一些。但假如在一个switch 语句中查找每一种类型,那么很可能错过一个重点,使最终的代码很难维护。在下一节中,大家会学习如何逐步对这个程序进行改进,使其显得越来越灵活。这是在程序设计中一种非常有意义的例子。

时间: 2024-10-28 22:07:10

77.JAVA编程思想——模拟垃圾回收的相关文章

《Java编程思想(第4版)》pdf

下载地址:网盘下载 内容简介 编辑 本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形.从Java的基础语法到最高级特性(深入的面向对象概念.多线程.自动项目构建.单元测试和调试等),本书都能逐步指导你轻松掌握.[1] 从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作.本书的作者拥有多年教学经验,对C.C++以及Java语言都有独到.深入的见解,以通俗易懂及小而直接的示例解释了一个个晦涩抽象的概

java编程思想第1、2、3章细节总结

转眼已经大二学期的暑假,已经使用java有一年了,才开始看thinking in java 这本经典书籍,算是做个系统总结吧,只列一些目前还掌握不熟的需要谨记的知识点. 第一章:对象导论 1.java中的权限:public,protected,private,default. public:可以被任何对象访问. protected:只能在本类和本类的内部类中使用,通过继承操作可以继承下去. private:只能在本类和本类的内部类中使用. default:如果没有加任何权限,则默认就是这个def

Java 编程思想 第五章 ----初始化与清理(1)

从今天开始每天一小时的java 编程思想的阅读和编码,其实就是把书上的代码抄下来. 5.5 清理:终结处理和垃圾回收 初始化和清理工作同等重要,但是清理工作却被常常忘记,但是在使用对象之后,对对象弃之不顾的做法并不是很安全.Java有自己的垃圾回收器负责回收无用的对象占据的内存资源.但也有特殊情况:假定你的内存区域不是用new获得的,这是无法用垃圾回收器释放所以java中允许在类中定义一个名为 finalize()的方法.       工作原理: 一旦垃圾回收器准备好释放对象占用的存储空间,将首

Java编程思想第四版读书笔记——第十三章 字符串

Java编程思想第四版读书笔记--第十三章 字符串 字符串的操作是计算机程序设计中最常见的行为. 关键词: StringBuilder ,StringBuffer,toString(),format转换,正则表达式, 1.不可变String String对象时不可变的.每当把String对象作为方法的参数时,都会复制一份引用.(其实就是对函数中参数列表中参数的操作不会影响外面的原参数) 如下: import static net.mindview.util.Print.*; public cla

什么是JAVA编程思想?

什么是JAVA编程思想?答案可能很会复杂,但也可以很简单.要了解JAVA编程思想,首先就要了解什么是编程思想,让我们来看看什么是编程思想,一句话来讲就是,用计算机来解决人们实际问题的思维方式,即编程思想. 我们学习编程语言的最终目的,就是希望用计算机来解决我们的实际问题.那么学习编程该如何入手,也是很多初学者犯难的一个问题,特别是对与非计算机专业的人来说更是如此.面对现实如此多的编程语言(比如:C,C++,JAVA,C# -)和 种类繁多的应用技术(比如: windows编程, linux编程,

JAVA编程思想读书笔记(五)--多线程

接上篇JAVA编程思想读书笔记(四)--对象的克隆 No1: daemon Thread(守护线程) 参考http://blog.csdn.net/pony_maggie/article/details/42441895 daemon是相于user线程而言的,可以理解为一种运行在后台的服务线程,比如时钟处理线程.idle线程.垃圾回收线程等都是daemon线程. daemon线程有个特点就是"比较次要",程序中如果所有的user线程都结束了,那这个程序本身就结束了,不管daemon是否

java编程思想总结(二)

java编程思想总结(二) java编程思想总结是一个持续更新的系列,是本人对自己多年工作中使用到java的一个经验性总结,也是温故而知新吧,因为很多基础的东西过了这么多年,平时工作中用不到也会遗忘掉,所以看看书,上上网,查查资料,也算是记录下自己的笔记吧,过一段时间之后再来看看也是蛮不错的,也希望能帮助到正在学习的人们,本系列将要总结一下几点: 面向对象的编程思想 java的基本语法 一些有趣的框架解析 实战项目的整体思路 代码的优化以及性能调优的几种方案 整体项目的规划和视角 其它遗漏的东西

JAVA编程思想(1) - 一切都是对象

-"如果我们说另一种不用的语言,那么我们就会发觉一个有些不同的世界" 1. 用引用操纵对象 每种编程语言都有自己的数据处理方式.有些时候,程序员必须时刻留意准备处理的是什么类型.您曾利用一些特殊语法直接操作过对象,或处理过一些间接表示的对象吗(C或C++里的指针)? 所有的这一切在JAVA里都得到了简化.在JAVA里一切都被视为对象,尽管是一切都被看成对象,但操纵的标识符实际上是一个"引用"而已,简单来说是:对象好比"电视",我们拥有的引用是&q

79.JAVA编程思想——抽象应用

79.JAVA编程思想--抽象应用 1     抽象应用 接下来该考虑一下设计方案剩下的部分了--在哪里使用类?既然归类到垃圾箱的办法非常不雅且过于暴露,为什么不隔离那个过程,把它隐藏到一个类里呢?这就是著名的"如果必须做不雅的事情,至少应将其本地化到一个类里"规则. 现在,只要一种新类型的Trash 加入方法,对TrashSorter 对象的初始化就必须变动.可以想象,TrashSorter 类看起来应该象下面这个样子: class TrashSorter extends Vecto