第10条:始终要覆盖toString

来源:互联网 发布:挺进大别山 知乎 编辑:程序博客网 时间:2024/06/06 09:24

术语:



        toString()方法在Object中已存在一个实现,如下:

    /**     * Returns a string representation of the object. In general, the     * {@code toString} method returns a string that     * "textually represents" this object. The result should     * be a concise but informative representation that is easy for a     * person to read.     * It is recommended that all subclasses override this method.     * <p>     * The {@code toString} method for class {@code Object}     * returns a string consisting of the name of the class of which the     * object is an instance, the at-sign character `{@code @}', and     * the unsigned hexadecimal representation of the hash code of the     * object. In other words, this method returns a string equal to the     * value of:     * <blockquote>     * <pre>     * getClass().getName() + '@' + Integer.toHexString(hashCode())     * </pre></blockquote>     *     * @return  a string representation of the object.     */    public String toString() {        return getClass().getName() + "@" + Integer.toHexString(hashCode());    }
        可以看出,它返回的字符串只类类名加上一个“@符号”,后面是十六进制形式的hashCode,这些信息对我们来说用处不大,所以为了提供更好的关于类和对象的说明,我们应该总是覆盖toString()方法来提供更加清晰的说明。

        toString方法虽然不会像equals这样的方法对类造成那么大的影响,但是一个好的toString可以使类用起来更加的舒服。当对象被传给println、printf、字符串联操作符(+)以及assert或者被调试器打印出来时,toString方法会被自动调用。这是一种重要的调用手段,如果不重写toString提供更明确的信息,这将很难让人理解。

        在实际应用中,toString方法应该返回对象中包含的所有值得关注的信息,如果对象太大或者对象中包含的状态信息难以用字符来表达,这样做就有点不切实际了。在这种情况下toString方法应该返回一个摘要信息,理想情况下,字符串应该是自描述的。在实现toString方法时,应该做出一个重要的决定,是否在文档中指定返回值的格式,对于值类也建议这么做,因为这可以被用做一种标准的、明确的、适合人阅读的对象表示法。这种表示法可以用于输入和输出以及用在永久的适合于人类阅读的数据对象中,如xml文档。如果指定了格式,那么就最好再提供一个相匹配的静态工厂方法或者构造器,以便程序员可以很容易地在对象和它的字符串表示法之间来回切换。Java平台类库中的许多值类都采用这种做法,包括BigInteger、BigDecimal和绝大多数的基本类型包装类(boxed primitive class)。

        指定格式也有其不足的地方,就是限制了toString()的灵活性,一旦指定了格式就必须坚持这种格式,程序员会编写相应的代码来解析这种字符串表示法,产生字符串表示法,以及把字符串表示嵌入到持久的数据中。如果将来的版本中改变了这种做法就会破坏他们的代码和数据。如果不指定格式的话就可以保留灵活。无论是否决定指定格式,都应该在文档中明确地表明你的意图。如果要指定格式必须严格遵守这条约定,如果不指定格式那么文档注释部分也应该有指示的指示信息告诉那些依赖于格式的细节进行编程或者产生永久数据的程序员在读到这行注释后,一旦格式改变就得自己承担后果了

        最后,无论是否指定格式,都要为toString返回值中包含的所有信息,提供一种编程式的访问途径。这样不仅可以提高程序的性能而且还会为回避掉在解析格式化字符串的过程出可能会出现错误的问题。

0 0
原创粉丝点击