Khởi tạo tĩnh bởi JVM


8

ngôn ngữ:
phiên bản java : 12.0.2
Mã nguồn chuỗi như sau:

 /* @implNote
 * The actual value for this field is injected by JVM. The static
 * initialization block is used to set the value here to communicate
 * that this static final field is not statically foldable, and to
 * avoid any possible circular dependency during vm initialization.
 */
static final boolean COMPACT_STRINGS;

static {
    COMPACT_STRINGS = true;
}

Cách hiểu câu này: 'Khối khởi tạo tĩnh được sử dụng để đặt giá trị ở đây để thông báo rằng trường cuối cùng tĩnh này không thể gập tĩnh và để tránh mọi phụ thuộc vòng tròn có thể có trong quá trình khởi tạo vm.'


Câu hỏi hay! Đây có thể là một sự khởi đầu: vi.wikipedia.org/wiki/Constant_folding Nhưng tôi không biết gì về "sự phụ thuộc vòng tròn trong quá trình khởi tạo vm".
Alex 75

@Alex 75 Theo ý kiến ​​của tôi, nếu họ đã viết như thế này: 'static boolean COMPACT_STRINGS = true'. Nó vẫn có thể tránh mọi phụ thuộc vòng tròn có thể, bởi vì 'COMPACT_STRINGS' đã được cung cấp một giá trị xác định. Nhưng nó không thể tránh được tĩnh có thể gập lại.
Xiu

Câu trả lời:


7

Đó là một lưu ý triển khai cho những người triển khai JVM. Nó không phải là một phần của tài liệu công cộng và không quan tâm đến các nhà phát triển sử dụng java.lang.String.

Nhưng nếu bạn muốn biết:

Hãy tưởng tượng rằng họ đã viết:

static final boolean COMPACT_STRINGS = true;

Sau đó, nó sẽ là một hằng số mà trình biên dịch có thể thay thế nó bằng giá trị truebất cứ nơi nào COMPACT_STRINGSđược sử dụng (chỉ trong java.langgói, bởi vì đó là một biến phạm vi gói cục bộ)

Bằng cách cung cấp cho nó giá trị truetrong bộ khởi tạo tĩnh, trình biên dịch không còn biết rằng đó là hằng số và tất cả các mã sử dụng nó, phải tìm kiếm giá trị thực mà nó có trong thời gian chạy.

Trong trường hợp này, điều đó rất hữu ích, vì JVM thay đổi giá trị này khi chạy (mặc dù vậy final, JVM vẫn có thể thay đổi nó), như ghi chú thực hiện đề cập.


bạn có thể giải thích phần even though it's final, the JVM can still change ittại sao JVM có thể thay đổi nó không? Tôi đã nhầm lẫn về cách JVM quản lý để thay đổi các biến không đổi.
Phanxicô đặt câu hỏi

1
@Francisaskquestion Đó là JVM làm cho nó trở thành cuối cùng và nó có thể phá vỡ các quy tắc mà nó đặt ra cho các ứng dụng.
dùng207421

@ user207421 ahh sau đó với một số kiến ​​thức về JVM, nó cũng có thể thay đổi các biến khác?
Phanxicô đặt câu hỏi

1
JVM có thể làm điều đó. Có thể có các thủ thuật sử dụng sự phản chiếu và / hoặc truy cập không an toàn hoạt động trong JVM hiện tại cho phép ứng dụng thực hiện điều đó, nhưng chúng có thể (và có thể sẽ xem xét hướng của Oracle) không còn hoạt động trong các phiên bản JVM trong tương lai.
Erwin Bolwidt

1
@Francisaskquestion JVM có thể làm bất cứ điều gì nó thích.
dùng207421
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.