2011-07-13 142 views
10

一個簡單的設計問題。爲什麼toBinaryString不是Integer類中的實例方法?

示例代碼:

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

爲什麼JDK的設計是不是像下面這樣?所以,toBinaryString函數返回的期望結果?

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

除了對靜態函數的廣泛可用性,是什麼等原因這種設計方法?他們是否使用任何特定的設計模式?如果是的話,哪種模式?

回答

9

您的示例代碼將創建一個Integer的實例,然後對其進行拆箱。有沒有必要的:

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

如果它是一個實例方法,你會被迫創建的Integer一個實例,但只能到int轉換成它的二進制表示,這將是煩人。

換句話說:避免不必要地創建對象。

+0

爲了避免*明確*不必要地創建對象,不需要?在這兩種情況下,自動裝箱最終都會創建基本相同的字節碼。(現在,熱點可能會完全消除對象的創建,但同樣適用於這兩種情況)。或者我錯過了什麼? –

+0

@ jon-skeet讓我們說'int'類型不存在。那麼這個設計模式背後的原因是什麼? –

+1

Andrzej:不,不會有任何自動裝箱,因爲參數類型爲「int」,而不是「Integer」。 –

15

這是因爲你不能有兩個同名的方法,一個是靜態的,一個是實例。爲同樣的功能再次使用兩個不同的方法名稱會令人困惑。

在靜態方法把似乎更符合邏輯的,因爲在這種情況下,你就不會得到它的二進制表示之前「包裝」一個int爲整數,它符合兩國的目的(二進制字符串intInteger) 。

+0

我知道了。我的問題是爲什麼jdk是這樣設計的。 –

+0

我已經回答了;這是因爲你不必將'int'包裝到'Integer'中,也可以防止類中有兩個方法(一個是靜態的而另一個不是)做同樣的事情。 –

+0

+1我懷疑這是答案 - 因爲'int'不是一個對象,但是自動裝箱可以讓你在將*傳遞給方法時(但不是在調用方法時)假裝它是一個。 'Integer.toBinaryString(42)'編譯,但'42.toBinaryString()'不。 –

6

在添加此方法後,在JDK1.0.2中,沒有自動裝箱,JVM比現在慢得多。我想,使用這種靜態方法可以輕鬆地將int和Integer轉換爲二進制字符串,而不必爲int轉換爲二進制文件創建新的Integer實例。

0

int,char,double ...這些都是默認數據類型,它們不是對象。方法應該是Object not datatype的一部分。

這樣的靜態方法比實例方法更高效。

相關問題