通用方法-始终要覆盖 toString

406 阅读2分钟

这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战

前言

toString()方法对于我们很重要,当我们调试或打印的时候总是希望直接toString()就可以把对应的对象的所有字段都输出出来的。但是我们经常都不覆盖Object的toString(),以至于调用之后返回的往往是类名加上一个“@符号”,后面是十六进制形式的hashCode,实际上没有任何帮助,所以我们都是用fashjson里面的toJsonString来操作的,还得引用一个新包,不好。

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

lombok覆盖 toString

直接使用@ToString或者@Data就可以直接覆盖tosString()方法了。省力又方便。

覆盖toString方法的好处

   public String toString() {
        return "User(id=" + this.id + ", userName=" + this.userName + ", isAdmin=" + this.isAdmin + ", userCode=" + this.userCode + ", accountMoney=" + this.accountMoney + ", leanMoney=" + this.leanMoney + ")";
    }

toString方法使我们在开发时更加的舒服。当对象被传给println、printf、字符串联操作符(+)以及assert或者被调试器打印出来时,toString方法会被自动调用。这是一种重要的调用手段,如果不重写toString提供更明确的信息,这将很难让人理解。

覆盖toString的注意事项

在实际应用中,toString方法应该返回对象中包含的所有值得关注的信息,如果对象太大或者对象中包含的状态信息难以用字符来表达,这样做就会导致调试更加困难,可能找对应的信息得大海捞针了,在这种情况下toString方法应该返回类的关键域信息;

在覆盖toString时可以指定输出格式,这样就可以编写相应的代码来解析这种字符串表示法,但是之后就不能轻易改动了,不然别处调用者可能会出现奇怪的bug而不知道。

总结

用@Data注解实体类,覆盖掉Object的toString(),将类的有用信息使用toString方法进行输出,这样就可以方便调试或者打印的时候输出