为了账号安全,请及时绑定邮箱和手机立即绑定

Java记忆参考

Java记忆参考

牧羊人nacy 2021-12-10 12:39:47
我正在通过方法创建对象。然后我想“摧毁”它。我需要以某种方式记住对指定对象的引用以调用destroy()它?我该怎么做?public class Obj {     private int size;     private boolean exist;     private Obj(int size) {          this.size = size;          this.exist = true;     }     public static Obj getObj(int size) {          Obj s = new Obj(size);          return s;     }     public void destroy() {          exist = false;     }}
查看完整描述

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 将责任放在调用者身上,因此最好尽可能避免。


在任何情况下,尝试在静态中池化可变变量通常是一个非常糟糕的主意。


查看完整回答
反对 回复 2021-12-10
?
凤凰求蛊

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;

     }

}


查看完整回答
反对 回复 2021-12-10
?
喵喔喔

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();

    }

}


查看完整回答
反对 回复 2021-12-10
  • 3 回答
  • 0 关注
  • 174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信