【问题标题】:Where to initialize static fields in java?在哪里初始化java中的静态字段?
【发布时间】:2014-02-25 15:35:00
【问题描述】:

我有几个类,其中一个需要计算对象已创建的次数(称为 lastId 的 int 字段)。 在 c++ 中,我们必须在主类中初始化静态字段值,然后我们才能在其他类中正确使用该静态字段并计算已创建的对象数量。 爪哇呢?我必须在哪里初始化静态字段值。 另外,我知道如何计算对象是否已创建,但是如果对象已被删除呢? java中没有析构函数,那么这个工作怎么做呢?

【问题讨论】:

  • 试一试,然后返回您的问题/代码

标签: java static field


【解决方案1】:

如果您只想计算类型调用的活动对象的数量

jps -lvm  # to find the pid of your process
jmap -histo {pid} # count all objects in the system

jmap -histo:live {pid} # count objects referenced

这将为您提供按类计算的实例数。

如果您不想可视化您的应用程序正在做什么,请尝试

jvisualvm

这将提供内存使用、线程等统计信息,以及 CPU 正在消耗和创建的对象的细分。


Java 呢?

你只需用类似的东西初始化它们

static int counter = 0;

我必须在哪里初始化静态字段值。

您将在同一位置初始化任何其他字段。

顺便说一句,如果你这样做了

static int counter;

默认情况下它会是 0,所以我怀疑你不需要初始化它。

如果对象已被删除怎么办?

这很容易,因为您不能删除对象。所以答案总是 0。;)

java中没有析构函数,那么这个工作怎么做呢?

Java 没有这样的东西,所以这个问题有点毫无意义。

【讨论】:

  • * 我认为有一种方法可以使用ReferenceQueue 或相关的东西来跟踪已删除(垃圾收集)的对象,但这可能超出了问题的范围。
  • @trutheality 你在这两个方面都是对的。听起来 OP 需要一个内存分析器,并且已经有工具可以做到这一点。
【解决方案2】:

您可以在声明中或在静态初始化器中进行初始化:

public class test
{
    //this is fine:
    public static int i = 1;

    //or this:
    public static int i;
    static
    {
        i = 1;
    }
}

【讨论】:

    【解决方案3】:

    如何初始化静态字段? 1. 声明时初始化字段。 2. 在静态块中初始化。 3. 初始化为 null 并从其他位置设置。这并不是真正初始化一个值,只是稍后设置一个有意义的值。

    有关示例,请参阅 Dave Doknjas 的答案。

    如何计算对象?请参阅 Peter Lawrey 的回答。

    析构函数呢? 由于为您处理对象集合,因此当没有对对象的引用时,实际上不需要析构函数。您不应该尝试在 Java 中管理自己的集合,它对您来说做得很好。如果你在收集对象时绝对需要做一些事情,你应该查看 finalize 方法,它在收集对象时运行。

    有关 finalize 的更多信息,请参阅http://javarevisited.blogspot.com/2012/03/finalize-method-in-java-tutorial.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      相关资源
      最近更新 更多