2016-06-19 15 views
8

Các mã sau đây cho Integer sử dụng đối tượng thực tập:Boolean có tập trung vào Java không?

Nó không phải là rõ ràng từ tài liệu API cho dù mã này cho Boolean còn sử dụng đối tượng thực tập nội trú:

Boolean.valueOf("true") 

Rõ ràng, nó có thể. Nhưng nó có phải không?

CẬP NHẬT

Tôi đồng ý rằng mã nguồn có thể giải thích những gì thực sự xảy ra (BTW, cảm ơn cho câu trả lời). Để làm cho câu hỏi ít quan trọng hơn, có bất kỳ phần nào của đặc tả Java API hay JSL mà nói với những gì PHẢI xảy ra?

Đó là tự nhiên để đặt câu hỏi đối với các mã như thế này:

String str = "true"; 
if (Boolean.valueOf(str) == Boolean.TRUE) { ... } 

Kết quả phụ thuộc vào việc "đối tượng thực tập" được đảm bảo hay không. Tốt nhất là nên tránh mã này hoàn toàn và sử dụng true thay vì Boolean.TRUE (thay vì tìm kiếm chi tiết trong bất kỳ thông số hoặc nguồn nào), nhưng đó là lý do hợp lệ để đặt câu hỏi.

LƯU Ý: Trên thực tế, tôi không thấy các đảm bảo về việc thực hiện đối tượng cho Integer trong bất kỳ thông số kỹ thuật nào có sẵn. Vì vậy, nó có thể tất cả chỉ là một chi tiết thực hiện không ai nên dựa vào.

+4

Bạn có thể tự kiểm tra bằng cách xem mã nguồn –

+0

Bạn cũng có thể kiểm tra bằng cách gọi hai lần và kiểm tra xem bạn có nhận được cùng một cá thể Boolean hai lần hay không. Tại sao bạn quan tâm? Điều này không nên thay đổi bất kỳ điều gì đối với mã của bạn. –

+0

@a_horse_with_no_name, ** là đối tượng thực tập bên ngoài đặc tả? ** Nguồn-khôn ngoan Tôi đoán nó trả về đối tượng 'Boolean.TRUE' (hoặc' Boolean.FALSE' cho '" false "'). Trong thực tế, với một bộ giá trị nhỏ như vậy (chỉ 2) các hằng số này đủ để mô hình hóa hồ bơi. Nhưng nó được quyết định bởi đặc điểm kỹ thuật? – uvsmtid

Trả lời

5

Các JLS đảm bảo rằng:

Integer i = 1; 
Boolean b = true; 

sẽ sử dụng thực tập (ít nhất là giữa -128 và 127 cho số nguyên, và cho đúng và sai cho Booleans).

Các javadocs liên quan cũng tin chắc rằng:

Integer i = Integer.valueOf(1); 
Boolean b = Boolean.valueOf(true); 

sẽ trở về đối tượng thực tập nội trú.

Tuy nhiên, không có bảo đảm rõ ràng như vậy đối với valueOf(String): mặc dù đó là trường hợp trong triển khai cụ thể bạn đang sử dụng, nó có thể không phải là trường hợp với JVM khác hoặc trong các bản phát hành trong tương lai. Thực tế, việc triển khai return new Boolean(Boolean.parseBoolean(input)) sẽ hợp lệ.

5

Dựa trên source code, boolean được phân tách như:

public static final Boolean FALSE = new Boolean(false); 
public static final Boolean TRUE = new Boolean(true); 

public static Boolean valueOf(String s) { 
    return toBoolean(s) ? TRUE : FALSE; 
} 

đâu TRUEFALSE là tĩnh (không thay đổi) đối tượng. Vì vậy, có, booleans phân tích được interned.

Tuy nhiên, tôi đồng ý với @JBNizet's comment rằng bạn không nên lấy hợp đồng mã từ mã nguồn: miễn là tính năng không được ghi lại, nhà phát triển Java có thể thay đổi quyết định của họ. Bạn sử dụng tốt hơn Boolean.equals để kiểm tra xem hai đối tượng có tương đương hay không.

2

Đây là source code:

public static Boolean valueOf(String s) { 
    return parseBoolean(s) ? TRUE : FALSE; 
} 

đâu TRUE là:

public static final Boolean TRUE = new Boolean(true); 

Nếu bạn vẫn không chắc chắn, xác định hai biến:

Boolean a = Boolean.valueOf("true"); 
Boolean b = Boolean.valueOf("true"); 

và kiểm tra bất cứ điều gì bạn muốn một mình.

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