在Java中,我们如何从类内部的方法中销毁一个类的实例?

52 浏览
0 Comments

在Java中,我们如何从类内部的方法中销毁一个类的实例?

我采用了与删除任何普通对象类似的方法,即将引用设置为null,然后让垃圾回收器完成其工作。\n然而,对于在类内部将引用设置为null,唯一的引用是\"this\"。那么下面的类代码是否有效:\n

class A{
  public A(){
    //初始化
  }
  public void method destruct(){
    if(someCondition){
      this=null;  //这个语句有效吗?为什么/为什么不?
    }
  }
}

0
0 Comments

在Java中,如何从类的方法中销毁一个类的实例?

这个问题的出现是因为在某些情况下,我们可能需要在类的方法中销毁该类的实例。然而,Java中并没有直接的方法可以销毁一个对象。因此,我们需要找到一种解决方法。

解决方法是使用委托(delegation)。通过委托,我们可以在类的方法中调用另一个对象的方法来销毁实例。

以下是一个示例代码:

class A {
   private AImpl impl = new AImpl();
   public void close() {
      if (impl != null)
         impl.close();
      impl = null;
   }
}

在这个示例中,类A中有一个私有的AImpl对象impl,它负责实际的实现。类A中的close()方法会调用AImpl对象的close()方法来销毁实例。在调用close()方法之后,我们将impl对象设置为null,以确保没有其他引用指向实例。

这种方法的好处是,通过委托,我们可以在类的方法中灵活地控制实例的销毁。这对于某些特定的场景很有用,比如在某些OSGi容器中,当组件被卸载时,代理对象会执行类似的销毁操作。这种方法可以确保只有一个引用指向实际对象,并且在销毁后清除它。

总结起来,虽然Java中没有直接的方法可以销毁一个对象,但我们可以通过委托的方式在类的方法中销毁实例。通过调用另一个对象的方法来实现销毁操作,并且在操作完成后清除对实例的引用。这种方法可以在某些特定的场景下很有用,比如在OSGi容器中卸载组件时。

0
0 Comments

这个问题的出现原因是由于在Java中,this不是一个lvalue,也就是不能赋值的东西。这是一个编译错误,就像42 = i;一样是一个编译错误。

JLS(Java语言规范)对赋值操作说了这样一句话:“赋值操作符的第一个操作数的结果必须是一个变量,否则就会产生一个编译错误。”(JLS 15.26.1)然后JLS的文字继续列举了一些可以作为变量的不同事物,而this不在其中。

此外,正如duffymo所说,这在Java中是完全错误的做法。让垃圾回收器(GC)去做它的工作就好了。

解决方法就是不要去手动销毁一个类的实例,而是让垃圾回收器自动回收它。垃圾回收器会自动检测没有被引用的对象,并将其内存空间释放出来。因此,不需要手动销毁实例,只需要确保没有任何引用指向它即可。

在Java中,我们可以通过设置所有引用指向一个实例为null来达到让垃圾回收器自动回收实例的目的。例如,如果我们有一个名为obj的实例,可以通过obj = null;来让垃圾回收器回收它。

总之,尽管在其他编程语言中可能存在手动销毁实例的需求,但在Java中,我们应该依赖垃圾回收器来自动管理内存。

0
0 Comments

在Java中,我们无法直接“销毁”一个对象。这种做法是错误的,不要这样做。

在Java中,对象是在堆上创建的。只要存在指向它们的引用,它们就会存在。垃圾回收器会清理这些引用。

当然,你应该尽量确保不会无谓地积累和持有引用(例如Swing中的监听器)。

但是你的提议根本不正确。请停止这样做。

0