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 +
                '}';
    }

 

posted on 2022-07-07 08:43  菜鸟乙  阅读(30)  评论(0编辑  收藏  举报