1

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

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 两次,第一次调用调试语句:

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

它应该返回 null,

我第二次调用它时, P[i] 现在有了一个值,

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

谢谢

4

4 回答 4

8

你不能。这就是为什么静态不好的部分原因:P不应该是静态的;它应该.TestClass

于 2013-06-07T18:59:54.830 回答
2

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

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

于 2013-06-07T19:02:01.780 回答
1

我猜你的方法是静态的?

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

于 2013-06-07T19:09:41.857 回答
0

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

于 2013-06-07T19:02:14.613 回答