本来以为isLowerCase只有对"a"-"z"才为true,isUpperCase只有对 "A"-"Z" 才为true,其它情况下都应该是false,谁知道jdk让我大跌了一回眼镜:
public class E {
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()的函数调用过程了,直接:
function isLowerCase(ch){
return (ch>='a' && ch<='z');
}
function isUpperCase(ch){
return (ch>='A' && ch<='Z');
}
不是挺好吗?
常量撞车始终是不对的,JDK为什么要这么干呢?大概是想用二进制位来组合各种type,可是又受限于常量类型被定义为byte型。可是现在的结果是,不但类型常量撞车,各种type还是不能正确的组合。