Effective Java 对于所用对象都通用的方法 10.始终要覆盖toString,玩转toString

来源:互联网 发布:淘宝运动服 编辑:程序博客网 时间:2024/05/29 17:15

虽然java.lamg.object提供了toString()方法的实现,但是它返回的字符串通常不是用户所期望看到的。就是一个地址,没有多大的意义。

toString的通用约定指出,返回的字符串应该是一个简洁的,但信息丰富,并且易于阅读的表达形式。

所以说对于类一定要覆盖toString方法,以便于获取到想要的信息,而且可以根据自己想要的信息来修改覆盖toString方法。

例:

import com.google.gson.Gson;public class User {    private String username;    private String password;    private int age;    private String info;    public User() {        // TODO Auto-generated constructor stub    }    public void setUsername(String username) {        this.username = username;    }    public void setPassword(String password) {        this.password = password;    }    public void setAge(int age) {        this.age = age;    }    public void setInfo(String info) {        this.info = info;    }    public String getUsername() {        return username;    }    public String getPassword() {        return password;    }    public int getAge() {        return age;    }    public String getInfo() {        return info;    }    @Override    public String toString() {        return "User [username=" + username + ", password=" + password                + ", age=" + age + ", info=" + info + "]";    }    @Override    public int hashCode() {        final int prime = 31;        int result = 1;        result = prime * result + age;        result = prime * result + ((info == null) ? 0 : info.hashCode());        result = prime * result                + ((password == null) ? 0 : password.hashCode());        result = prime * result                + ((username == null) ? 0 : username.hashCode());        return result;    }    @Override    public boolean equals(Object obj) {        if (this == obj)            return true;        if (obj == null)            return false;        if (getClass() != obj.getClass())            return false;        User other = (User) obj;        if (age != other.age)            return false;        if (info == null) {            if (other.info != null)                return false;        } else if (!info.equals(other.info))            return false;        if (password == null) {            if (other.password != null)                return false;        } else if (!password.equals(other.password))            return false;        if (username == null) {            if (other.username != null)                return false;        } else if (!username.equals(other.username))            return false;        return true;    }    public static void main(String[] args) {        User user = new User();        user.setUsername("yancy");        user.setPassword("weixin_39923324");        user.setAge(18);        user.setInfo("weixin_39923324");        System.out.println(user.toString());    }}

打印的结果:User [username=yancy, password=weixin_39923324, age=18, info=weixin_39923324]

这种方法大家肯定都会,但是呢,我想要CSV数据格式,或者说我想要JSON数据格式,明明可以在toString方法中实现,为什么要转弯来实现。

CSV:逗号分隔。

实现方法:

    String csv = user.getUsername() + "," + user.getPassword() + ","                + user.getAge() + "," + user.getInfo();    System.out.println(csv);

但是一个List呢, 无非嵌套循环。

    StringBuilder sb = new StringBuilder();        for (User u : users) {            sb.append(u.getUsername() + "," + u.getPassword() + ","                    + u.getAge() + "," + u.getInfo() + "\n");        }    }

这样会不会很low,而且多地方使用,那还需封装,现在有一个高大上的方法,继承ArrarList,修改toString方法,去掉”[],”即可。

ArrayList toString方法:

 public String toString() {        Iterator<E> it = iterator();        if (! it.hasNext())            return "[]";        StringBuilder sb = new StringBuilder();        sb.append('[');        for (;;) {            E e = it.next();            sb.append(e == this ? "(this Collection)" : e);            if (! it.hasNext())                return sb.append(']').toString();            sb.append(',').append(' ');        }    }

修改后:

import java.util.ArrayList;import java.util.Iterator;public class MyList<E> extends ArrayList<E> {    /**         *          */    private static final long serialVersionUID = 1L;    @Override    public String toString() {        super.toString();        Iterator<E> it = iterator();        if (!it.hasNext())            return "[]";        StringBuilder sb = new StringBuilder();        for (;;) {            E e = it.next();            sb.append(e == this ? "(this Collection)" : e);            if (!it.hasNext())                return sb.toString();        }    }}不仅达到目的,而且还能学到源码。不过不能乱改,会有意想不到的错误哟。
阅读全文
0 0
原创粉丝点击