public?static?void?main(String[]?args)?{
??for(?char?c?=?170;?c<65371;c++)
????if(c==8522)?
??????c=64255;
????else?if(Character.isLowerCase(c)||Character.isUpperCase(c))
??????System.out.println(c+"("+(c-0)+"):"+Character.isLowerCase(c)+"?-?"+Character.isUpperCase(c));
?}
}
看了一下,isLowerCase()和isUpperCase()是跟著 getType()的返回走的,jdk認為,getType的返回等于 UPPERCASE_LETTER 的就是大寫字母,等于 LOWERCASE_LETTER 的就是小寫字母。這本來也沒有錯。但是 UPPERCASE_LETTER? 和 LOWERCASE_LETTER 是兩個整型常量,他們的定義見:
http://java.sun.com/j2se/1.4.2/docs/api/constant-values.html
java.lang.Character
...
?public static final byte DIRECTIONALITY_RIGHT_TO_LEFT 1
?public static final byte DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC 2
...
?public static final byte LOWERCASE_LETTER 2
...
?public static final int MIN_RADIX 2
...
?public static final byte UPPERCASE_LETTER 1
Character的常量撞車撞的這么厲害,不知道設計jdk的人是怎么想的。這樣我們getType的時候獲得了1,是沒有辦法知道這個字符是 DIRECTIONALITY_RIGHT_TO_LEFT 的還是 UPPERCASE_LETTER 的,獲得2也沒有辦法知道是 DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC 、MIN_RADIX 還是 LOWERCASE_LETTER 的 ,因此 isLowerCase()和isUpperCase() 通過getType()來判斷是否大小寫字母當然要犯錯誤了。
要我說,isLowerCase()和isUpperCase()全部用最簡單的寫法來實現,也不需要一個getType()的函數調用過程了,直接:
????return?(ch>='a'?&&?ch<='z');
}
function?isUpperCase(ch){
????return?(ch>='A'?&&?ch<='Z');
}
不是挺好嗎?
常量撞車始終是不對的,JDK為什么要這么干呢?大概是想用二進制位來組合各種type,可是又受限于常量類型被定義為byte型??墒乾F在的結果是,不但類型常量撞車,各種type還是不能正確的組合。