作者adrianshum (Alien)
看板java
标题Re: [问题] object指向null後 class variable怎麽办?
时间Fri Nov 13 15:31:50 2009
※ 引述《petr (petr)》之铭言:
: ※ 引述《tkcn (小安)》之铭言:
: : 写个 finalize method 吧,
: : 这样当 GC 去回收此物件时,就会执行到 finalize 了。
: : 不过要注意一点,
: : 并不是将 reference 设成 null,GC 就会立刻回收该物件。
: : 所以如果你希望将 reference 设成 null 时,sum 能立刻反应,
: : 还是自己写 --sum 吧。
: 使用finalizer是绝对不智的
: JVM内thread执行finalizer的priority通常很低
: Java的spec甚至没有规定finalizer一定会被执行
: 甚至可能JVM结束了,finilizer都不会被执行到
: 如果想要有一个统计总共有几个instance的资讯
: 1. 最简单的方式是使用Collection来装这些instance,不用了就把它remove掉
: 或者
: 2. 使用一个private的变数来记录这个instance是否已经不再需要,
: 如果这instance不要了,就把这个变数设为false,然後--sum,但是每个client
: 要使用这类class时,要先check这个instance是否合法,要把它丢掉的时候
: 设为false
没有什麽不智吧.
一般要取得资源的情况, 做的方法是靠 close() (叫什麽不重要),
然後 finalizer 也会顺便做 (如果有人漏了 close 的话):
public class Foo {
public enum Status {
ACTIVE,
CLOSED,
}
private static int totalCount = 0;
private Status status;
public Foo() {
this.status = Status.ACTIVE;
++totalCount;
}
public void close() {
if (Status.ACTIVE == this.status) {
this.status = Status.CLOSE;
--totalCount;
}
}
public void finalize() {
this.close();
}
}
用的时候
Foo foo = new Foo();
// 用 foo
// 用完了
foo.close();
搞定
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 202.155.236.82