2014-07-17 13 views
8

PMD cảnh báo tôi để tránh sự khởi tạo Boolean (vì lý do hiệu quả). Tôi có một cái gì đó như thế nàyTại sao tránh hiện tượng Boolean là một ý tưởng hay?

Boolean variable = new Boolean(somestringIGotRepresentingABoolean); 

Và tôi dự định sử dụng này

Boolean variable = Boolean.valueOf(somestringIGotRepresentingABoolean); 

Tại sao là tốt hơn?

Trả lời

11

Lý do là Boolean mới luôn trả về một phiên bản mới. Vì các cá thể Boolean là không thay đổi nên không có nghĩa là có nhiều hơn 2 trường hợp. Một cho sai và một cho đúng.

Hãy thử điều này và bạn sẽ thấy

Boolean boolean1 = new Boolean("true"); 
Boolean boolean2 = new Boolean("true"); 
Boolean boolean3 = new Boolean("true"); 

System.out.println(System.identityHashCode(boolean1)); 
System.out.println(System.identityHashCode(boolean2)); 
System.out.println(System.identityHashCode(boolean3)); 

Boolean valueOf1 = Boolean.valueOf("true"); 
Boolean valueOf2 = Boolean.valueOf("true"); 

System.out.println(System.identityHashCode(valueOf1)); 
System.out.println(System.identityHashCode(valueOf2)); 
9

Từ các tài liệu, bạn có thể đọc:

new Boolean(boolean value) 

Phân bổ một đối tượng Boolean đại diện cho các đối số giá trị.

Lưu ý: Rất hiếm khi sử dụng công cụ xây dựng này. Trừ khi một cá thể mới được yêu cầu, giá trị nhà máy tĩnhOf (boolean) thường là một lựa chọn tốt hơn. Nó có khả năng mang lại hiệu suất không gian và thời gian tốt hơn đáng kể.

4

Trong Java Boolean (như String) là không thay đổi. Điều đó có nghĩa là nếu bạn sử dụng

Boolean x = new Boolean(true); 
x = false; 

x sẽ trỏ đến một đối tượng khác sau "x = false" so với trước đây. Vì vậy, nếu bạn sử dụng phương thức Boolean.valueOf() Java sẽ quan tâm rằng chỉ có hai đối tượng Boolean ở mức tối đa, một đối tượng đại diện cho true và cái kia biểu diễn sai. Nếu bạn sử dụng .valueOf (true) nó sẽ trả về một handle cho đối tượng true và nếu bạn sử dụng .valueOf (false) nó sẽ trả về một handle cho đối tượng false. Vì vậy bạn không tạo ra bất kỳ đối tượng không cần thiết nào và do đó chúng sẽ không bị xóa bởi bộ thu gom rác.

Nếu bạn sử dụng "Boolean() mới" thay vì điều này không hoạt động và Java sẽ tạo đối tượng mới mỗi lần. Vì vậy, bạn sẽ có một tấn các đối tượng không cần thiết mà có thể sẽ được giải phóng khá nhanh chóng và phải được làm sạch bởi bộ thu gom rác. Vì vậy, chi phí cho bạn nhiều bộ nhớ hơn (cho tất cả các đối tượng), thời gian cho việc phân bổ (khi tạo Booleans mới) và thời gian cho deallocation (khi các đối tượng bị thu gom rác thu thập), trong khi cho bạn không có lợi thế nào cả.

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