IT Notes‎ > ‎Java‎ > ‎Java Language‎ > ‎《Java 解惑》笔记‎ > ‎

Puzzle 21: What's My Class, Take 2

在书中的这个问题,其实是要说明 Java  API 中存在一些不能通过名称来准确辨识行为的方法,这可能导致误用。用户在使用不熟悉的函数(方法)时,要注意查询 API 文档,仔细了解方法的含义,不要望文生义。

书中举出了两个方法:
  • String.replace(String, String)
  • String.replaceAll(String, String)
假如没任何说明文档,我们可能认为它们其实是一样的。在具体使用中,一般也是一样的,但有例外:
String hello = "hello.world.Puzzle21";
hello.replaceAll("\\.", File.separator);
以上代码在 Windows 平台上运行将报错。因 Windows 上的 File.separator \ 同时也是转义标识符号,程序运行时,对 \ 后的字符进行转义处理,遂报错。String.replaceAll 将参数视作某种表达式,用以支持正则表达式运算,结果引入了这个问题。
而用下面的代码,是可以的:
String hello = "hello.world.Puzzle21";
hello.replace("\\.", File.separator);
如果在 Windows 上运行,将正常输出:
hello\world\Puzzle21
这是因为 String.replace 方法,将两个参数都按照字面含义的字符串来处理。这个方法不支持正则表达式。

附:
  1. 代码:http://code.google.com/p/cyiridiumsitewikineed/source/browse/trunk/src/javapuzzlers/book/javapuzzlers/ch03/p21/MeToo.java
  2. 原书阅读:《Java解惑》第28页
  3. 这种问题在工作中的开发过程里出现更甚,相当多的方法看名称都不能准确知道含义,文档也不全,必须阅读源码才能知晓。
Comments