在 C++ 中,以下代码:
#include <stdio.h>
static const char *init()
{
printf("in init()\n");
}
static void func()
{
static const char *str = init();
printf("in func()\n");
}
int main()
{
for (int i=0; i<10; ++i) {
func();
}
return 0;
}
表明尽管调用了func(),但str仅通过在用于初始化str的函数init()中打印跟踪消息来初始化一次。运行时,总共有10行trace,一次为init(),10次为func()
在Java中,下面的代码不应该做同样的事情吗?
class test {
private String init()
{
System.out.println("in init()");
return "FOO";
}
private void func()
{
final String str = init();
System.out.println("in func()");
}
public test()
{
for (int i=0; i<10; ++i) {
func();
}
}
public static main(String[] args)
{
test app = new test();
}
}
运行时,有 20 行输出,init()和func()各 10 行。根据我读到的关于最终变量的内容,我认为它的行为方式相同。所以我尝试了static final并且它不会编译(也不只是static)有没有办法做到这一点?我需要从类中的几个不同方法调用一个耗时的初始化函数,因此仅将变量移动到类范围是行不通的。此外,由于局部变量不会自动初始化,因此我不能包含对null的if测试在给它赋值之前围绕变量。我想我可以在类范围内为类中的每个方法创建一个变量,但是管理它会很痛苦。如果我在每种方法中都包含以下内容,则最好的类比是:
public myfunc1()
{
final String funcName = java.lang.Thread.currentThread().getStackTrace()[1].getMethodName();
}
public myfunc2()
{
final String funcName = java.lang.Thread.currentThread().getStackTrace()[1].getMethodName();
}
在这种情况下, funcName将在每个方法中获得一个唯一值,但初始化成本很高。