当前位置:天才代写 > tutorial > JAVA 教程 > 确保正确的排除java工具

确保正确的排除java工具

2017-11-14 08:00 星期二 所属: JAVA 教程 浏览:817

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

 

    关键字:

天才代写-代写联系方式