Trong C++, đoạn code sau:Làm thế nào để khởi tạo một biến địa phương trong Java chỉ một lần
#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;
}
cho thấy rằng bất chấp vô số các invokations của func(), str chỉ khởi tạo một lúc bằng cách in thông báo dấu vết trong hàm init() được sử dụng để khởi tạo str. Khi chạy, có tổng cộng 10 dòng của dấu vết, một lần cho init() và 10 lần cho func()
Trong Java, không nên đoạn mã sau làm điều tương tự?
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();
}
}
Khi chạy, có 20 dòng đầu ra, 10 cho mỗi init() và func(). Dựa trên những gì tôi đọc về các biến số cuối cùng, tôi nghĩ rằng nó sẽ hoạt động theo cùng một cách. Vì vậy, tôi đã thử static final và nó sẽ không biên dịch (cũng không chỉ static) Có cách nào để thực hiện việc này không? Tôi cần gọi hàm khởi tạo tốn thời gian từ một số phương thức khác nhau trong lớp của mình, vì vậy, việc di chuyển biến sang phạm vi lớp sẽ không hoạt động. Hơn nữa, vì các biến cục bộ không được tự động khởi tạo, tôi không thể bao gồm một bài kiểm tra nếu cho null xung quanh biến trước khi gán cho nó một giá trị. Tôi cho rằng tôi có thể tạo một biến trong phạm vi lớp cho mỗi phương thức trong lớp học của tôi, nhưng quản lý nó sẽ là một nỗi đau để quản lý. Sự giống nhau tốt nhất sẽ là cái gì nếu tôi được bao gồm một cái gì đó như sau trong mọi phương pháp:
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 trong trường hợp này sẽ nhận được một giá trị duy nhất trong mỗi phương pháp, nhưng việc khởi tạo là tốn kém.
Bạn cần boft chuỗi str và hàm init() là tĩnh – maverik
_str_ không thể _static_, nó sẽ không biên dịch. _init() _ không thể _static_ vì nó dựa trên dữ liệu cá thể. – Xaq
http: // ideone.com/nHN6m9 – maverik