2010-12-15 17 views
29

rồi, do đó nói rằng tôi có một lớp trông như thế này:Java: theo thứ tự các trường cuối cùng tĩnh được khởi tạo là gì?

public class SignupServlet extends HttpServlet { 
    private static final Logger SERVLET_LOGGER=COMPANYLog.open(SignupServlet.class); 
    private static final ExceptionMessageHandler handler = new ExceptionMessageHandler(); 
    private static final SignupServletObservableAgent signupObservableAgent = 
     new SignupServletObservableAgent(null, SERVLET_LOGGER); 
} 

Tôi có thể đếm trên bộ nạp lớp để khởi tạo những lĩnh vực theo thứ tự, như vậy mà tôi có thể dựa vào SERVLET_LOGGER được khởi tạo trước khi signupObservableAgent?

Trả lời

44

Có, chúng được khởi tạo theo thứ tự chúng xuất hiện trong nguồn. Bạn có thể đọc tất cả các chi tiết đẫm máu trong The Java Language Specification, §12.4.2. Xem bước 9, đọc:

... thực thi khởi tạo biến lớp và trình khởi tạo tĩnh của lớp, hoặc trình khởi tạo trường của giao diện, theo thứ tự văn bản, như thể chúng là một khối duy nhất, ngoại trừ các biến lớp cuối cùng và các trường của giao diện có giá trị là hằng số biên dịch được khởi tạo trước tiên ...

+0

Tuyệt vời - cảm ơn! – sangfroid

3

Tôi nghĩ rằng việc khởi tạo các trường tĩnh có thể được sắp xếp lại. Ít nhất đó là cách tôi hiểu được JMM specification

Có một số trường hợp truy cập vào biến chương trình (trường đối tượng, trường tĩnh lớp và phần tử mảng) có thể xuất hiện theo thứ tự khác với chỉ định bởi chương trình.

+3

Phần này cũng nói "... và giá trị của b không * phụ thuộc vào giá trị của a, thì trình biên dịch được tự do sắp xếp lại các hoạt động này, ..." –

+0

Báo giá là về truy cập, chứ không phải khởi tạo. – EJP

1

nếu lớp phụ và siêu lớp ở đó.

  1. EX: 'A': siêu lớp 'B': lớp phụ và nó kéo dài siêu đẳng 'A'
  2. khi lớp B nạp sau đó Một lớp học cũng tải
  3. tất cả các biến tĩnh có được bộ nhớ với giá trị mặc định từ 'A' và 'B' lớp
  4. thì thành viên tĩnh (biến tĩnh, khối tĩnh) được thực thi theo thứ tự từ trên xuống dưới của lớp 'A' và sau đó là lớp 'B' theo thứ tự khai báo. phương thức chính thức cuối cùng được thực thi từ lớp con một cách tự động.
-1

Đây là nơi bạn có thể sử dụng khối tĩnh đảm bảo trình tự thực hiện.

public class SignupServlet extends HttpServlet { 
    private static final Logger SERVLET_LOGGER; 
    private static final ExceptionMessageHandler handler; 
    private static final SignupServletObservableAgent signupObservableAgent; 

    static { 
     SERVLET_LOGGER = COMPANYLog.open(SignupServlet.class); 
     handler = new ExceptionMessageHandler(); 
     signupObservableAgent = new SignupServletObservableAgent(null, SERVLET_LOGGER); 
    } 
} 
+0

Vô nghĩa. Đơn hàng đã được bảo đảm. – EJP