我剛剛發現在 Java 5 裡聲明的一個方法:Integer.getInteger(String):
http://java.sun.com/J2SE/1.5.0/docs/api/java/lang/Integer.Html#getInteger(Java.lang.String)
根據指定的名稱得到系統屬性的整數值。
第一個參數將被認為是系統屬性的名稱。系統屬性可以通過 System.getProperty(Java.lang.String)方法訪問得到。屬性值字符串將被解釋成一個整數,並且以表示這個值的Integer對象形式返回。可能出現的數字格式的詳細說明可以在 getProperty 的定義說明裡找到。
那麼就讓我來看看是否理解了:
Integer.valueOf(String) 通過假設 String 表達的是一個數值而把 String 轉化成數字。也就是說, Integer.valueOf("12345") 得到數字 12345。
Integer.getInteger(String) 通過假設 String 是一個系統屬性數值的名稱而把 String 轉換成一個數字。也就是說, Integer.getInteger("12345") 應該是得到 null。
有誰會認為這兩者之間有足夠清晰的區別?有多少bug是因為本來想使用valueOf但卻使用了getInteger而導致的?
這種形式的方法重載就是所謂的諧音重載(near-phrase overloading)。這是我剛發明的術語。它說的是人們使用非常相似的術語表達完全不同的東西。看一下 x 和 y 這兩個詞,一種情況下它們用做 gm(x) 和 gm(y),(譯者注:gm是重量單位’克‘),而另一種上下文中它們用做 cm(x) 和 cm(y)(譯者注:cm是長度單位’厘米‘)。如果你這樣使用
- distance(gm(x), gm(y))< distance(cm(x), cm(y))
那麼這就是一種錯誤的對 x 的 y 用法!你應該在這個上下文中使用 x 和 y 之外的變量名。事實上,那個方法應該被叫做 getIntegerProperty。
這是我在Java中看到的絕對會產生歧義一個最糟糕的案例。他們應該把事情做得漂亮些。
Update:結果我又發現了更糟糕的一個: Boolean.getBoolean("true") 得出的結果會等於 Boolean.FALSE。