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();
}
}
添加回答
举报