1 重点关注
1.1 该节是作为建议,而非强制
1.2 代码演练3.1
1.3 替代方法:用json.toString替代
JSONObject.toJSON(mapCert))
https://i.cnblogs.com/articles/edit;postId=10765235
2 课程内容
2.1 使用toString的优点
1.toString的通用约定指出,被返回的字符串应该是一个"简洁的,但信息丰富并且易于阅读的表达形式",“建议所有的子类都覆盖这个方法”。
2.提供好的toString实现可以使类用起来更加舒适,当对象被传递给println,printf,字符串练操作符(+)以及assert或者被调试器打印出来的时候,toString方法就会被自动调用。
3.在实际应用中,toString方法应该返回对象中包含的所有指的关注的信息。
4.在实现toString的时候,必须要做一个很重要的决定:是否在文档中指定值的格式。对于值类来说建议这么做,指定格式的好处是可以被用做一种标准的,明确的,适合人阅读的对象表示法这种表示法可以用于输入和输出,以及用在永久的适合于人类阅读的数据对象中,例如XML文档。如果你指定了格式,最好再提供一个相匹配的静态工厂或者构造器,以便于程序员很容易的在对象和他的字符串表示法之间来回转换。
2.2 使用toString 的缺点
1 增大了工作量,在工作量饱和或紧急任务时不建议这样做
2 如果这个类已经被广泛使用,一旦指定格式,就必须始终如一的坚持这种格式。程序员就会编写出相应的代码来解析这种字符串表示法,产生字符串表示法,以及把字符串表示法嵌入到持久的数据中。如果将来的发行版本中改变了这种表示法,就会破坏他们的代码和数据。如果不指定格式,就可以保留灵活性,便于在将来的发行版本中增加信息或者改进格式。
2.3 使用toString指定格式与不指定格式的注释
参考3.4和3.5
2.4 toString 的应用案例
参考3.3
3 代码演练
3.1 核心代码 覆盖toString方法
/** * %d 整数类型(十进制) * %03d 如果小于3位,前方补0 * * 按照指定格式打印 * * @author weidoudou * @date 2022/7/7 8:29 * @param * @return java.lang.String **/ @Override public String toString(){ return String.format("(%03d) %03d-%04d",areaCode,prefix,lineNumber); }
public static void main(String[] args) {
short s1 = 007;
short s2 = 867;
short s3 = 5309;
PhoneNumber phoneNumber = new PhoneNumber(s1,s2,s3);
System.out.println(phoneNumber);
}
3.2 反例 未覆盖toString方法
实例:
package com.ddwei.test.core.chapter10.demo1; import java.util.HashMap; import java.util.Map; public final class PhoneNumber { private final short areaCode; private final short prefix; private final short lineNumber; public PhoneNumber(short areaCode, short prefix, short lineNumber) { rangeCheck(areaCode, 999, "area code"); rangeCheck(prefix, 999, "prefix"); rangeCheck(lineNumber, 9999, "line number"); this.areaCode = (short)areaCode; this.prefix = (short)prefix; this.lineNumber = (short)lineNumber; } private static void rangeCheck(int arg,int max,String name) { if(arg < 0 || arg > max) throw new IllegalArgumentException(name +": "+ arg); } @Override public boolean equals(Object obj) { //1、使用==操作符检查“参数是否为这个对象的引用” if(obj == this) return true; //2、使用instanceof操作符检查“参数是否为正确的类型” if(!(obj instanceof PhoneNumber)) return false; //3、把参数转化成正确的类型 PhoneNumber pn = (PhoneNumber)obj; //4、对于该类的每个“关键”域,检查参数中的域是否与该对象中对应的域相匹配(其实就是比较两个对象的值是否相等了) return pn.lineNumber == lineNumber && pn.prefix == prefix && pn.areaCode == areaCode; } public static void main(String[] args) { short s1 = 707; short s2 = 867; short s3 = 5309; PhoneNumber phoneNumber = new PhoneNumber(s1,s2,s3); System.out.println(phoneNumber); } }
测试结果:
com.ddwei.test.core.chapter10.demo1.PhoneNumber@7699a589
Process finished with exit code 0
3.3 正例 覆盖toString方法
实例:
package com.ddwei.test.core.chapter10.demo2; public final class PhoneNumber { private final short areaCode; private final short prefix; private final short lineNumber; public PhoneNumber(short areaCode, short prefix, short lineNumber) { rangeCheck(areaCode, 999, "area code"); rangeCheck(prefix, 999, "prefix"); rangeCheck(lineNumber, 9999, "line number"); this.areaCode = (short)areaCode; this.prefix = (short)prefix; this.lineNumber = (short)lineNumber; } private static void rangeCheck(int arg,int max,String name) { if(arg < 0 || arg > max) throw new IllegalArgumentException(name +": "+ arg); } @Override public boolean equals(Object obj) { //1、使用==操作符检查“参数是否为这个对象的引用” if(obj == this) return true; //2、使用instanceof操作符检查“参数是否为正确的类型” if(!(obj instanceof PhoneNumber)) return false; //3、把参数转化成正确的类型 PhoneNumber pn = (PhoneNumber)obj; //4、对于该类的每个“关键”域,检查参数中的域是否与该对象中对应的域相匹配(其实就是比较两个对象的值是否相等了) return pn.lineNumber == lineNumber && pn.prefix == prefix && pn.areaCode == areaCode; } /** * %d 整数类型(十进制) * %03d 如果小于3位,前方补0 * * 按照指定格式打印 * * @author weidoudou * @date 2022/7/7 8:29 * @param * @return java.lang.String **/ @Override public String toString(){ return String.format("(%03d) %03d-%04d",areaCode,prefix,lineNumber); } public static void main(String[] args) { short s1 = 007; short s2 = 867; short s3 = 5309; PhoneNumber phoneNumber = new PhoneNumber(s1,s2,s3); System.out.println(phoneNumber); } }
测试结果:
(007) 867-5309
Process finished with exit code 0
3.4 指定格式的注释
/** * 返回此电话号码的字符串表示形式。 * 字符串由14个字符组成,格式为"(XXX) YYY-ZZZZ",其中XXX为区号,YYY为前缀,ZZZZ为行号(每个大写字母代表一个十进制数字) * * 如果有一些行号太短比如说是三位数,那么我们在开头用0来填充。例如,如果行号的值是123,则字符串表示形式的最后四个字符将是"0123"。 * * 注意,区号后的右括号与前缀的第一个数字之间用一个空格隔开。 * @return */ @Override public String toString() { return String.format("(%03d) %03d-%04d",areaCode,prefix,lineNumber); }
3.5 不指定格式的注释
/** * 请返回关于号码的简要描述。具体的细节是不确定的,可能会改变,但以下可能被视为典型。 * * PhoneNumber{areaCode=区号, prefix=前缀, lineNumber=行号} * @return */ @Override public String toString() { return "PhoneNumber{" + "areaCode=" + areaCode + ", prefix=" + prefix + ", lineNumber=" + lineNumber + '}'; }
诸葛