2012-01-31 39 views
10

Khi nào chúng ta nên sử dụng biến cuối cùng tĩnh chưa được khởi tạo? Tôi biết rằng một biến cuối cùng tĩnh chưa được khởi tạo chỉ có thể được gán các giá trị trong khối khởi tạo tĩnh, nhưng tôi không thể nghĩ ra bất kỳ việc sử dụng thực sự nào cho điều này.Khi nào chúng ta nên sử dụng biến cuối cùng tĩnh chưa được khởi tạo?

+0

có lẽ _never_? –

+0

Bạn có ý nghĩa gì với "trống"? Bạn có nghĩa là biến 'static final' được khởi tạo thành' null' không? Hay bạn chỉ có nghĩa là bất kỳ loại 'static final' variable (' private static final', 'public static final', v.v.)? –

+0

Ông có nghĩa là trống như chưa được khởi tạo. – fivedigit

Trả lời

8

tôi giả sử bạn có nghĩa là:

public static final Object obj; 

với không có giá trị ban đầu được chỉ định rõ ràng?

Bạn có thể gán nó trong khối static dựa trên một số tính toán chỉ có thể xảy ra trong thời gian chạy, như đọc một số tệp thuộc tính để tạo một hằng số Ứng dụng không được biết tại thời gian biên dịch.

+0

thankyou rất nhiều! –

+0

@Tudor, Tại sao nó mặc định là 'null'? Hành vi này có được đảm bảo trong thông số kỹ thuật không? Dường như với tôi rằng giá trị mặc định là không xác định bởi vì chúng tôi sẽ không thể đọc nó trước khi chuyển nhượng ở nơi đầu tiên (lỗi trình biên dịch). – Pacerier

+0

@Pacerier: Được phát hiện tốt. Nó thực sự sẽ là một lỗi biên dịch thời gian để không gán một giá trị cho một trường 'final' và spec cho biết mặc định sẽ không bao giờ được quan sát cho các trường như vậy. Tôi đã sửa chữa câu trả lời của mình. – Tudor

17

Được sử dụng khi khởi tạo biến không thể thực hiện trong một dòng. Ví dụ:

private static final Map<String, String> CACHE; 

static { 
    Map<String, String> cache = new HashMap<String, String>(); 
    cache.put("foo", "bar"); 
    cache.put("zim", "bam"); 
    // lots of other entries 
    CACHE = Collections.unmodifiableMap(cache); 
} 
5

Về cơ bản, nếu bạn cần chỉ định giá trị không thể biểu diễn dễ dàng trong một biểu thức. Ví dụ, bạn có thể muốn thực hiện một số logic để xây dựng một bản đồ bất biến, và sau đó gán nó.

Nói chung nó dễ đọc hơn để đưa "xây dựng" logic vào một phương pháp tĩnh riêng biệt, và sử dụng trong các nhiệm vụ bình thường mặc dù:

private static final Map<String, String> FOO_MAP = buildFooMap(); 
+0

cảm ơn! Nó cho tôi lời giải thích tốt hơn. –

0

tĩnh + cuối cùng

Nói tóm lại,

tĩnh - để làm cho nó như là một biến lớp - Không phụ thuộc vào các đối tượng (sử dụng đối với mọi đối tượng cùng một vị trí luôn)

Cuối cùng - để biến nó thành hằng số. (Nếu cuối cùng là trước một Biến thể!)

Chúng ta chỉ cần tĩnh ở đâu?

=> Có thể đếm số lượng đối tượng một đối tượng.

Chúng ta chỉ cần cuối cùng ở đâu?

=> Thực hiện điều gì đó liên tục!

Chúng tôi cần tĩnh + cuối cùng ở đâu?

=> Biến biến có thể truy cập được đối với mọi đối tượng và tạo một hằng số. Việc tạo lớp cho COLOR có thể là.

Đối với các biến tĩnh trống, quá trình khởi tạo đã được thực hiện bằng khối tĩnh.

public class StaticDemo 
{ 
    private static final String name; 

    static 
    { 
     name = "yash"; 
    } 
} 

và tại sao sử dụng sản phẩm nào? vì có thể bạn không thể khởi tạo ngay từ đầu. Tôi chấp nhận cái trước đó.

0

Nếu trình khởi tạo cho trường tĩnh có thể ném một ngoại lệ, bạn không thể khởi tạo nó trong một dòng, bạn phải có một khối tĩnh hoặc một phương thức tĩnh.

+0

cảm ơn! Nó có thể là một sử dụng của biến cuối cùng tĩnh chưa được khởi tạo. –

0

Biến cuối cùng tĩnh phải được khởi tạo tại thời điểm tạo, không giống như biến cuối cùng trống, bạn không thể trì hoãn khởi tạo cho hàm tạo vì chúng là tĩnh.

Các vấn đề liên quan