虽然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();
}
}
}
不仅达到目的,而且还能学到源码。不过不能乱改,会有意想不到的错误哟。