3 回答
TA貢獻1784條經驗 獲得超8個贊
因此,您的方法創建一個資源,其他一些實體對其進行操作,然后您釋放該資源。我暖嗎?
在這種情況下,clean 方法是將在對象上操作的代碼作為函數對象傳遞,因此您絕對可以在它退出時進行清理。總體思路稱為“周圍執行”。
import java.util.function.Consumer;
public static void getObj(int size, Consumer<Obj> consumer) {
Obj s = new Obj(size);
try {
consumer.accept(s);
} finally {
s.destroy();
}
}
用于:
Obj.getObj(1066, s -> {
... something with s ...;
});
或者,還有java.lang.AutoCloseabletry-with-resource 將責任放在調用者身上,因此最好盡可能避免。
在任何情況下,嘗試在靜態中池化可變變量通常是一個非常糟糕的主意。
TA貢獻1825條經驗 獲得超4個贊
垃圾收集器應該為你做...但是如果你想隱式調用 destroy ,你可以定義所有實例的類級別列表
public class Obj {
private int size;
private boolean exist;
private static List<Obj> list = new ArrayList<>();
private Obj(int size) {
this.size = size;
this.exist = true;
}
public static Obj getObj(int size) {
Obj s = new Obj(size);
list.add(s) // save ref
return s;
}
public void destroy() {
exist = false;
}
}
TA貢獻1735條經驗 獲得超5個贊
其他答案似乎試圖教育您有關垃圾收集的知識。
但是,為了回答您的實際問題......在你的代碼,你將需要調用工廠方法和結果分配給一個變量:Obj obj = Obj.getObj(1234)。這是您對對象的引用。當您想調用該destroy()方法時,請使用該引用。
例如:
public class Main {
public static void main(String[] args) {
Obj obj = Obj.getObj(42);
obj.destroy();
}
}
添加回答
舉報
