【问题标题】:Java Resetting private static member when all class instances are out of scope当所有类实例超出范围时Java重置私有静态成员
【发布时间】:2013-10-21 00:48:03
【问题描述】:

您好,我想为我的类提供一个静态私有成员,以跟踪创建的类对象的数量,但我也想在所有类实例超出范围时处理并重置它。我的情况更容易,因为我不必处理嵌套范围。即所有实例都在同一级别创建:

if (true) {
    MyClass();  // Count 1
    MyClass();  // Count 2
}
if (true) {
    MyClass();  // Count 1
    MyClass();  // Count 2
}

我当然可以很容易地在每个作用域的最后一行添加一个重置,但是有没有在 MyClass 中实现的任何编程方式来实现这一点?

谢谢

【问题讨论】:

  • 我不太明白你想做什么。 Java 没有像 C++/Objective-C 这样的解构器,你不能处理静态成员,因为 Java 没有删除/释放/等。

标签: java class static instance


【解决方案1】:

Java 没有提供可靠的方法来准确了解所有对象何时超出范围。此外,如果函数在作用域结束之前返回,或者抛出异常,那么简单地在每个作用域的末尾添加一个 MyClass.staticReset() 调用可能无法解决问题。

一个可靠的解决方案是将调用添加到包含变量范围的finally 块:

if (someConditionIsTrue) try {
    MyClass();  // Count 1
    MyClass();  // Count 2
} finally {
    MyClass.staticReset();
}

请注意,将计数保存在静态内存中可能会在并发环境中出现问题。更好的选择是创建一些明确表示“范围”的对象,向其注册实例,然后在 finally 块中对其调用 reset()

【讨论】:

  • 谢谢,所以我认为它不是自动检测 java 中超出范围的对象的方法。
  • @user1589188 正确 - 这是垃圾收集的结果。
猜你喜欢
  • 2015-12-18
  • 1970-01-01
  • 2014-09-02
  • 2023-04-07
  • 2011-02-24
  • 2012-06-25
  • 1970-01-01
  • 2016-08-03
  • 2012-12-17
相关资源
最近更新 更多