【发布时间】:2013-06-04 00:37:27
【问题描述】:
在 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 仅通过在函数 init() 用于初始化 str。运行时,总共有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行。 根据我对 final 变量的了解,我认为它的行为方式相同。 所以我尝试了 static final,但它无法编译(也不只是 static) 有没有办法做到这一点?我需要调用一个耗时的初始化函数 我的班级中有几种不同的方法,因此仅将变量移动到班级范围是行不通的。 此外,由于局部变量不会自动初始化,因此在为变量赋值之前,我不能在变量周围包含 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 在这种情况下会在每个方法中得到一个唯一的值,但是初始化很昂贵。
【问题讨论】:
-
您需要将字符串 str 和函数 init() 设为静态
-
str 不能是 static,它不会编译。 init() 不能是 static,因为它依赖于实例数据。
标签: java initialization variable-assignment final