2011-07-13 35 views
10

Câu hỏi thiết kế đơn giản.Tại sao toBinaryString không phải là một phương thức thể hiện trong lớp Integer?

Mẫu mã:

Integer int1 = new Integer(20);  
    System.out.println(Integer.toBinaryString(int1)); 

Tại sao JDK thiết kế không phải là một cái gì đó như sau? do đó, hàm toBinaryString trả về kết quả mong muốn là?

System.out.println(int1.toBinaryString()); 

Bên cạnh cho khả năng sử dụng rộng của một hàm tĩnh, các lý do khác cho cách tiếp cận thiết kế này là gì? Họ có sử dụng bất kỳ mẫu thiết kế cụ thể nào không? Nếu đó là sau đó, mà mô hình?

Trả lời

9

Mã mẫu của bạn tạo một phiên bản Integer và sau đó mở hộp thư đó. Không cần phải cho rằng:

int int1 = 20; 
String binary = Integer.toBinaryString(int1); 

Nếu nó là một phương pháp dụ, bạn muốn được buộc để tạo ra một thể hiện của Integer chỉ để chuyển đổi một int để biểu diễn nhị phân của nó, đó sẽ là gây phiền nhiễu.

Nói cách khác: để tránh tạo các đối tượng không cần thiết.

+0

Để tránh * rõ ràng * tạo đối tượng không cần thiết, phải không? Tự động hóa sẽ kết thúc tạo ra bytecode cơ bản giống nhau trong cả hai trường hợp.(Bây giờ, Hotspot có thể bỏ qua việc tạo đối tượng hoàn toàn, nhưng lại có thể áp dụng cho cả hai trường hợp). Hay tôi đang thiếu một cái gì đó? –

+0

@ jon-skeet cho phép chỉ nói loại 'int' không tồn tại. Vậy thì lý do đằng sau mẫu thiết kế này là gì? –

+1

Andrzej: Không, sẽ không có bất kỳ autoboxing nào, vì tham số gõ nó 'int', không phải' Integer'. –

15

Điều này là do bạn không thể có hai phương thức có cùng tên, một ví dụ tĩnh và một ví dụ. Có hai tên phương thức khác nhau cho cùng một chức năng một lần nữa sẽ gây nhầm lẫn.

Đưa vào một phương pháp tĩnh có vẻ logic hơn vì trong trường hợp đó bạn sẽ không phải "bọc" một int vào một số nguyên trước khi biểu diễn nhị phân của nó và nó phục vụ cả hai mục đích (chuỗi nhị phân cho intInteger) .

+0

Tôi biết điều đó. Câu hỏi của tôi là tại sao jdk được thiết kế theo cách này. –

+0

Tôi đã trả lời rằng; nó là như vậy bởi vì bạn không phải quấn một 'int' vào một' Integer' và cũng để ngăn chặn việc có hai phương thức trong lớp (một tĩnh và một không) làm điều tương tự. –

+0

+1 Tôi nghi ngờ đây là câu trả lời - bởi vì 'int' không phải là một đối tượng, nhưng autoboxing cho phép bạn giả vờ nó là một khi * truyền * cho một phương thức (nhưng không phải khi gọi một phương thức trên nó). 'Integer.toBinaryString (42)' biên dịch, nhưng '42.toBinaryString()' thì không. –

6

Quay lại khi phương pháp này được thêm vào, trong JDK1.0.2, không có hộp số tự động và JVM chậm hơn nhiều so với bây giờ. Tôi tưởng tượng rằng có phương thức tĩnh này cho phép chuyển đổi cả int và Integer thành chuỗi nhị phân một cách dễ dàng, và không phải tạo một thể hiện Integer mới chỉ để chuyển đổi một int thành nhị phân.

0

int, char, double ... đây là các kiểu dữ liệu mặc định, đây không phải là đối tượng. Phương thức phải là một phần của đối tượng không phải kiểu dữ liệu.

Phương pháp tĩnh như vậy hiệu quả hơn phương pháp mẫu.

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