在C++中,以下代码:
运行时,会输出20行结果,每个init()和func()各10行。 根据我对final变量的理解,我认为它应该是相同的行为。 所以我尝试了static final,但它无法编译(即使只是static)。 有没有办法实现这个功能? 我需要从我的类中的几个不同方法中调用一个耗时的初始化函数, 因此仅将变量移动到类范围内是行不通的。 此外,由于本地变量不会自动初始化,因此我不能在给变量赋值之前在变量周围包含if测试以检查是否为null。 我想我可以为我的类中的每个方法创建一个变量,但管理它将很麻烦。 最好的比喻就是如果我在每个方法中都包含以下内容:
在这种情况下,funcName在每个方法中得到一个唯一的值,但初始化是昂贵的。
#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;
}
通过在初始化str的函数init()中打印跟踪信息,可以发现尽管 func() 被多次调用,但是 str 只被初始化一次。 运行时,总共有10行跟踪信息,一次为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测试以检查是否为null。 我想我可以为我的类中的每个方法创建一个变量,但管理它将很麻烦。 最好的比喻就是如果我在每个方法中都包含以下内容:
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在每个方法中得到一个唯一的值,但初始化是昂贵的。