如何在调用之后关闭或销毁一个类?

时间:2013-06-07 18:58:02

标签: java apex-code

我在类中调用了一个方法,如下所示:

String key1 = "test1";
String key2 = "test2";

long[] datalr = new long[] {};

TestClass myTC1 = new TestClass(); 
datalr = myTC1.callerSub(key1,key2);
TestClass myTC2 = new TestClass(); 
datalr = myTC2.callerSub(key1,key2);

测试类如下:

public class TestClass {

  private final Long[] P = new Long[18];



  Public TestClass {
  }

  public long[] callerSub(string key1, String key2){

    long[] datalr = new long[] {0,0};
    integer i;
    system.debug(LoggingLevel.INFO,P[0]);

    datalr[0] = 2;
    datalr[1] = 3;
    for ( i = 0; i < 18; ++i ){
      P[i] = i+1
    }
    return datalr;

  }
}

我两次调用TestClass.callerSub, 我第一次调用debug语句:

system.debug(LoggingLevel.INFO,P[0]);

它应该返回null,

我第二次打电话给它,P [i]现在有一个值,

如何在再次调用之前关闭或销毁TestClass类?

由于

4 个答案:

答案 0 :(得分:8)

你做不到。这是静态状态不好的部分原因:P不应该是静态的;它应该与TestClass实例相关联。

答案 1 :(得分:2)

删除类的实例最接近的是删除对类的所有引用并调用system.gc(),其中建议 jvm以运行垃圾收集器。无法保证jvm在您调用它时决定运行gc。

请参阅Louis Wasserman对您问题的实际解决方案的回答。

答案 2 :(得分:1)

我猜你的方法是静态的?

您可以将P变为变量,而不是静态字段,或者使您的方法成为实例方法,并将您的字段P作为实例字段(通过删除static关键字)。然后,您可以为每个调用创建一个新实例:new TestClass().callerSub(key1, key2)

答案 3 :(得分:0)

因为P是静态字段,所以它是在JVM启动时创建的,仅在JVM关闭时销毁。另外,因为你使P变为常量(使用final),所以不能设置P = null以便向垃圾收集器建议它应该被删除。因此,该数组将位于内存中的相同位置,并且只要程序正在运行,该静态变量将始终指向该数组。