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

确保切确的解除java对象[Java编程]

赞助商链接



  本文“确保切确的解除java对象[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
Java不具有象C++的“破坏器”那样的概念.在C++中,一旦破坏(排除)一个对象,就会自动调用破坏器办法.之所以将其省略,大约是由于在Java中只需简单地忘掉对象,不需强行破坏它们.垃圾汇集器会在必要的时刻自动回收内存.
垃圾汇集器大大都时刻都能很好地工作,但在某些情形下,我们的类大概在自己的存在期间采纳一些行动,而这些行动要求必须举行明确的排除工作.正如第4章已经指出的那样,我们并不知道垃圾汇集器什么时刻才会显身,大概说不知它什么时刻会调用.所以一旦但愿为一个类排除什么东西,必须写一个分外的办法,明确、专门地来做这件事情.同时,还要让客户程序员知道他们必须调用这个办法.而在全部这一切的背面,就如第9章(违例掌握)要具体注释的那样,必须将这样的排除代码置于一个finally从句中,从而防备任何大概呈现的违例事件.
下面介绍的是一个计算机帮助计划系统的例子,它能在屏幕上描绘图形:
//: CADSystem.java
// Ensuring proper cleanup
import java.util.*;

class Shape {
  Shape(int i) {
    System.out.println("Shape constructor");
  }
  void cleanup() {
    System.out.println("Shape cleanup");
  }
}

class Circle extends Shape {
  Circle(int i) {
    super(i);
    System.out.println("Drawing a Circle");
  }
  void cleanup() {
    System.out.println("Erasing a Circle");
    super.cleanup();
  }
}

class Triangle extends Shape {
  Triangle(int i) {
    super(i);
    System.out.println("Drawing a Triangle");
  }
  void cleanup() {
    System.out.println("Erasing a Triangle");
    super.cleanup();
  }
}

class Line extends Shape {
  private int start, end;
  Line(int start, int end) {
    super(start);
    this.start = start;
    this.end = end;
    System.out.println("Drawing a Line: " +
           start + ", " + end);
  }
  void cleanup() {
    System.out.println("Erasing a Line: " +
           start + ", " + end);
    super.cleanup();
  }
}

public class CADSystem extends Shape {
  private Circle c;
  private Triangle t;
  private Line[] lines = new Line[10];
  CADSystem(int i) {
    super(i + 1);
    for(int j = 0; j < 10; j++)
      lines[j] = new Line(j, j*j);
    c = new Circle(1);
    t = new Triangle(1);
    System.out.println("Combined constructor");
  }
  void cleanup() {
    System.out.println("CADSystem.cleanup()");
    t.cleanup();
    c.cleanup();
    for(int i = 0; i < lines.length; i++)
      lines[i].cleanup();
    super.cleanup();
  }
  public static void main(String[] args) {
    CADSystem x = new CADSystem(47);
    try {
      // Code and exception handling...
    } finally {
      x.cleanup();
    }
  }
} ///:~
这个系统中的全部东西都属于某种Shape(多少形状).Shape本身是一种Object(对象),因为它是从根类明确担当的.每个类都重新定义了Shape的cleanup()办法,同时还要用super调用那个办法的底子类版本.固然对象存在期间调用的全部办法都可负责做一些要求排除的工作,但关于特定的Shape类——Circle(圆)、Triangle(三角形)以及Line(直线),它们都拥有自己的构建器,能完成“作图”(draw)任务.每个类都有它们自己的cleanup()办法,用于将非内存的东西恢复回对象存在之前的气象.
在main()中,可看到两个新关键字:try和finally.我们要到第9章才会向大家正式举荐它们.此中,try关键字指出背面跟随的块(由花括号定界)是一个“鉴戒区”.也就是说,它会遭到分外的报酬.此中一种报酬就是:该鉴戒区背面跟随的finally从句的代码必定会得以履行——不管try块到底存不存在(通过违例掌握技术,try块可有多种不平常的利用).在这里,finally从句的意思是“老是为x调用cleanup(),无论会发生什么事情”.这些关键字将在第9章举行全面、完好的注释.
在自己的排除办法中,必须注意对底子类以及成员对象排除办法的调用次序——假如一个子对象要以另一个为底子.普通,应采纳与C++编译器对它的“破坏器”采纳的一样的情势:首先完成与类有关的全部特别工作(大概要求底子类元素仍旧可见),然后调用底子类排除办法,就象这儿演示的那样.
很多情形下,排除大概并非个问题;只需让垃圾汇集器尽它的职责便可.但一旦必须由自己明确排除,就必须分外谨严,并要求全面的考虑.

1. 垃圾汇集的次序
不能期望自己能切当知道什么时刻会开始垃圾汇集.垃圾汇集器大概永久不会得到调用.即便得到调用,它也大概以自己乐意的任何次序回收对象.除此以外,Java 1.0实现的垃圾汇集器机制普通不会调用finalize()办法.除内存的回收以外,其他任何东西都最好不要依靠垃圾汇集器举行回收.若想明确地排除什么,请制作自己的排除办法,并且不要依靠finalize().但是正如从前指出的那样,可逼迫Java1.1调用全部收尾模块(Finalizer).
  以上是“确保切确的解除java对象[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 确保切确的解除java对象
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

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

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