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

模拟垃圾回收站[Java编程]

赞助商链接



  本文“模拟垃圾回收站[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
这个问题的本质是若将垃圾丢进单个垃圾筒,事实上是未经分类的.但在今后,某些特别的信息必须恢复,以便对垃圾精确地归类.在最开始的办理筹划中,RTTI扮演了关键的角色(详见第11章).
这并非一种普通的计划,因为它增添了一个新的限制.恰是这个限制使问题变得非常风趣——它更象我们在工作中碰到的那些非常麻烦的问题.这个额外的限制是:垃圾到达垃圾回收站时,它们全都是混合在一同的.程序必须为那些垃圾的分类定出一个模子.这恰是RTTI施展作用的地方:我们有大量不出名的垃圾,程序将精确判断出它们所属的范例.

//: RecycleA.java 
// Recycling with RTTI
package c16.recyclea;
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 the value 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(double newval) {
    val = newval;
  }
}

class Paper extends Trash {
  static double val = 0.10f;
  Paper(double wt) { super(wt); }
  double value() { return val; }
  static void value(double newval) {
    val = newval;
  }
}

class Glass extends Trash {
  static double val = 0.23f;
  Glass(double wt) { super(wt); }
  double value() { return val; }
  static void value(double newval) {
    val = newval;
  }
}

public class RecycleA {
  public static void 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 instanceof Aluminum)
        alBin.addElement(t);
      if(t instanceof Paper)
        paperBin.addElement(t);
      if(t instanceof Glass)
        glassBin.addElement(t);
    }
    Trash.sumValue(alBin);
    Trash.sumValue(paperBin);
    Trash.sumValue(glassBin);
    Trash.sumValue(bin);
  }
} ///:~

要注意的第一个地方是package语句:
package c16.recyclea;
这意味着在本书采取的源码目录中,这个文件会被置入从c16(代表第16章的程序)分支出来的recyclea子目录中.第17章的解包工具会负责将其置入精确的子目录.之所以要这样做,是因为本章会多次改写这个特定的例子;它的每个版本城市置入自己的“包”(package)内,避免类名的冲突.
此中成立了几个Vector对象,用于包容Trash句柄.当然,Vector实际包容的是Object(对象),所以它们终究可以包容任何东西.之所以要它们包容Trash(大概从Trash衍生出来的其他东西),唯一的来由是我们需求谨严地避免放入除Trash以外的其他任何东西.假如真的把某些“错误”的东西置入Vector,那么不会在编译期得到出错或告诫提醒——只能通过运行期的一个违例知道自己已经犯了错误.
Trash句柄加入后,它们会丧失自己的特定标识信息,只会成为简单的Object句柄(上溯造型).但是,由于存在多形性的因素,所以在我们通过Enumeration sorter调用动态绑定办法时,一旦后果Object已经造型回Trash,仍旧会发生精确的行为.sumValue()也用一个Enumeration对Vector中的每个对象举行操作.
表面上持,先把Trash的范例上溯造型到一个调集包容底子范例的句柄,再回过头重新下溯造型,这仿佛是一种非常笨拙的做法.为什么不只是一开始就将垃圾置入得当的容器里呢?(事实上,这恰是扒开“回收”一团迷雾的关键).在这个程序中,我们很简单便可以换成这种做法,但在某些情形下,系统的构造及机动性都能从下溯造型中得到极大的好处.
该程序已满意了计划的初衷:它可以正常工作!只要这是个一次性的筹划,就会显得非常超卓.但是,真正有效的程序应当可以在任什么时刻候办理问题.所以必须问自己这样一个问题:“假如情形发生了改变,它还能工作吗?”举个例子来说,厚纸板目前是一种非常有代价的可回收物品,那么若何把它集成到系统中呢(分外是程序很大很复杂的时刻)?由于前面在switch语句中的范例查抄编码大概散布于整个程序,所以每次加入一种新范例时,都必须找到全部那些编码.若不慎遗漏一个,编译器除了指出存在一个错误之外,不能再供应任何有代价的帮忙.
RTTI在这里利用不当的关键是“每种范例都举行了测试”.假如由于范例的子集需求特别的对待,所以只探求那个子集,那么情形就会变得好一些.但假定在一个switch语句中查找每一种范例,那么极大概错过一个重点,使终究的代码很难保护.在下一节中,大家会学习若何渐渐对这个程序举行改良,使其显得越来越机动.这是在程序计划中一种非常有意义的例子.
  以上是“模拟垃圾回收站[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 模拟垃圾回收站
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

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

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