Re: [問題] object指向null後 class variable怎麼辦?
※ 引述《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
討論串 (同標題文章)