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

虽然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();
        }
    }

}

不仅达到目的,而且还能学到源码。不过不能乱改,会有意想不到的错误哟。

猜你喜欢

转载自blog.csdn.net/weixin_39923324/article/details/77993173