zoukankan      html  css  js  c++  java
  • 始终要重载toString

    本文涉及到的概念
    1.重载toString方法的意义
    2.两个注意事项
     
    1.重载toString方法的意义
    重载toString,返回关于当前实例的描述信息。这在调试错误,打印实例信息时,可以带来有意义的信息。如果不重载,使用默认的toString实现,返回的含义不清楚。重载toString的目的是,给使用当前实例的客户端返回有意义的信息。
     
    2.两个注意事项
    a.重载toString时,如果返回的字符串是指定格式的,那么,要添加注释说明该格式。并且,在以后的实现中,不要轻易去修改该格式,因为客户端代码有可能依赖该格式来写代码,修改格式,会影响客户端代码,造成客户端代码不可用。
    b.如果不指定返回的字符串的格式,那么,也要在注释中说明。这样,你在以后就可以修改返回的字符串格式,对于格式发生改变带来的影响,你不用去考虑。
     
    此外,toString返回值中包含的所有信息,我们要给客户端提供一种访问途径(提供一些get方法),避免客户端代码去解析toString返回值中的信息。如果没有为客户端提供这些访问方法(用来获取toString返回值中包含的所有信息),那么,客户端代码会尝试去解析toString返回值的信息,这样,这个toString返回值的格式也成了事实上的API。
     
    一个例子:
    import java.util.*;
    
    public final class PhoneNumber {
    private final short areaCode;
    private final short prefix;
    private final short lineNumber;
    
    public PhoneNumber(int areaCode, int prefix, int 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);
    }
    
    /**
    * returns a brief description of this potion
    */
    @Override
    public String toString() {
    return String.format("(%03d) %03d-%04d", areaCode, prefix, lineNumber);
    }
    
    @Override
    public boolean equals(Object o) {
    if (o == this)
    return true;
    if (!(o instanceof PhoneNumber))
    return false;
    PhoneNumber pn = (PhoneNumber) o;
    return pn.lineNumber == lineNumber && pn.prefix == prefix && pn.areaCode == areaCode;
    }
    
    // Broken - no hashCode method!
    
    // A decent hashCode method - Page 48
    @Override
    public int hashCode() {
    int result = 17;
    result = 31 * result + areaCode;
    result = 31 * result + prefix;
    result = 31 * result + lineNumber;
    return result;
    }
    
    public static void main(String[] args) {
    Map<PhoneNumber, String> m = new HashMap<PhoneNumber, String>();
    m.put(new PhoneNumber(707, 867, 5309), "Jenny");
    System.out.println(m.get(new PhoneNumber(707, 867, 5309)));
    
    System.out.println(new PhoneNumber(707, 867, 5309));
    }
    }
     
    输出结果:
    Jenny
    (707) 867-5309
  • 相关阅读:
    分享自Allen 《打开excel,word发送没反映OUTLOOK无法打开》
    AD域只禁用USB存储器而开放其他USB设备
    sql2000安装sp4补丁包教程_sql2000sp4
    为帮助保护您的安全,Internet Explorer已经阻止从此站点下载文件
    IExplore.exe应用程序错误解决方法
    单网卡双IP,同时上内外网
    关于
    七伤拳
    <转>在外企混的,一定要懂“外企潜台词”
    习惯
  • 原文地址:https://www.cnblogs.com/ttylinux/p/6561701.html
Copyright © 2011-2022 走看看