为数据提供返回String形式的编程访问,不只是toString()

来源:互联网 发布:java求最小素数 编辑:程序博客网 时间:2024/06/01 08:23

   这个建议来自Joshua Bloch的“Provide Programmatic Access to All Data Available in String Form”。我这里以他的提纲为基础然后结合自己的理解写了这篇短文。

  这个建议的意思是如果你写一个模块就要把模块里面可以公开的数据信息以String形式提供给客户。因为如果你不提供这样的String访问接口,那么这个使用这个模块的客户要得到一些这个模块信息的时候会感到很不方便。更糟糕的是可能他自己去解析能够得到的String信息。很多时候这个String就是来自toString()的返回。

 

  他举了个例子就是java.lang.Throwable.getStackTrace()

 

   这里的getStackTrace()就是很好的例子。当你抓到一个Throwable(一般就是Exception)就可以调getStackTrace()得到StackTraceElement数组,然后用循环把异常的详细信息以String的形式展现出来。而且客户还可以用StackTraceElement的函数对每个StackTraceElement来获取信息。如果没有这个getStackTrace(),用户就要自己从printStackTrace()里面去解析异常的详细信息,解析这个栈的确让人很痛苦。如果说用toString(),您试一下,它只能打出当前栈顶元素的信息。

 

  这里我认为值得强调的是2个地方,一个是"All Data Available"里面的"All",另一个"Available"。先说All,因为你不能假设你的客户代码会永远不访问某个数据,因此要把所有的数据信息都提供出来,也就是做+法。再说Available,这个意思是要访问权限最小化,这也是OO的一个原则,这就是个-法。举个例子,譬如大家都知道ArrayList是由数组实现的,而这个数组的真实大小是小于等于size()的。这个时候要不要提供这个数组的长度的方法呢?当然不要,因为这不是List接口要求,对ArrayList来说用户也不需要关心。

  翻看自己以前写过的代码,啊,很多没有遵循这个规则。有些是把所有信息都写到toString(),以至于客户代码要解析toString()的字符。还有些就算是写了toString()也没有涵盖所有的公开信息。很多信息都是在客户代码里面解析实现。因为这样的String一般都是给人看的,所以这样的痛苦的代码都是在写log的时候用的。当他们要在log里面打印这个对象信息的时候,get这个字段,get那个字段,然后判断逻辑最后组成String。 这原本是这个类自己的职责。

原创粉丝点击