在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()<中打印跟踪消息来初始化一次/ em>用于初始化 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行输出,每行10个用于 init()和 func()。 根据我读到的关于 final 变量的内容,我认为它的行为方式相同。 所以我尝试了静态最终并且它不会编译(也不仅仅是静态) 有没有办法做到这一点?我需要从中调用一个耗时的初始化函数 在我的类中有几种不同的方法,所以只是将变量移动到类范围是行不通的。 此外,由于局部变量未自动初始化,因此在为变量赋值之前,我不能在变量周围包含 if 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 将在每个方法中获得唯一值,但初始化很昂贵。
答案 0 :(得分:5)
以下是一个非常接近的近似值:
class test {
private static final String str = init();
private static String init()
{
System.out.println("in init()");
return "FOO";
}
private void func()
{
System.out.println("in func()");
}
public test()
{
for (int i=0; i<10; ++i) {
func();
}
}
public static void main(String[] args)
{
test app = new test();
}
}
请注意,str
在加载类时初始化,而不是在第一次调用func()
时初始化。
答案 1 :(得分:2)
final
限定符通过单个方法调用使变量保持不变。
由于每个实例需要一个值,因此可以在方法之外使用实例成员变量。
private final String str = init();
private void func()
{
System.out.println("in func()");
}
如果要在所有实例的所有方法调用中使用单个值,则可以在方法外部使用静态成员变量。
private static final String str = init();
private void func()
{
System.out.println("in func()");
}