Integer.getInteger你不是在玩我吧?
我剛剛發(fā)現(xiàn)在 Java 5 里聲明的一個(gè)方法:Integer.getInteger(String):
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Integer.html#getInteger(java.lang.String)
根據(jù)指定的名稱得到系統(tǒng)屬性的整數(shù)值。
***個(gè)參數(shù)將被認(rèn)為是系統(tǒng)屬性的名稱。系統(tǒng)屬性可以通過 System.getProperty(java.lang.String)方法訪問得到。屬性值字符串將被解釋成一個(gè)整數(shù),并且以表示這個(gè)值的Integer對(duì)象形式返回??赡艹霈F(xiàn)的數(shù)字格式的詳細(xì)說明可以在 getProperty 的定義說明里找到。
那么就讓我來看看是否理解了:
Integer.valueOf(String) 通過假設(shè) String 表達(dá)的是一個(gè)數(shù)值而把 String 轉(zhuǎn)化成數(shù)字。也就是說, Integer.valueOf("12345") 得到數(shù)字 12345。
Integer.getInteger(String) 通過假設(shè) String 是一個(gè)系統(tǒng)屬性數(shù)值的名稱而把 String 轉(zhuǎn)換成一個(gè)數(shù)字。也就是說, Integer.getInteger("12345") 應(yīng)該是得到 null。
有誰會(huì)認(rèn)為這兩者之間有足夠清晰的區(qū)別?有多少bug是因?yàn)楸緛硐胧褂胿alueOf但卻使用了getInteger而導(dǎo)致的?
這種形式的方法重載就是所謂的諧音重載(near-phrase overloading)。這是我剛發(fā)明的術(shù)語。它說的是人們使用非常相似的術(shù)語表達(dá)完全不同的東西。看一下 x 和 y 這兩個(gè)詞,一種情況下它們用做 gm(x) 和 gm(y),(譯者注:gm是重量單位’克‘),而另一種上下文中它們用做 cm(x) 和 cm(y)(譯者注:cm是長(zhǎng)度單位’厘米‘)。如果你這樣使用
- distance(gm(x), gm(y))< distance(cm(x), cm(y))
那么這就是一種錯(cuò)誤的對(duì) x 的 y 用法!你應(yīng)該在這個(gè)上下文中使用 x 和 y 之外的變量名。事實(shí)上,那個(gè)方法應(yīng)該被叫做 getIntegerProperty。
這是我在Java中看到的絕對(duì)會(huì)產(chǎn)生歧義一個(gè)最糟糕的案例。他們應(yīng)該把事情做得漂亮些。
Update:結(jié)果我又發(fā)現(xiàn)了更糟糕的一個(gè): Boolean.getBoolean("true") 得出的結(jié)果會(huì)等于 Boolean.FALSE。
【編輯推薦】