Tôi đồng ý với các ý kiến trên về việc ghi đè toString()
lên các lớp của riêng bạn (và về việc tự động hóa quá trình đó càng nhiều càng tốt).
Đối với các lớp bạn không xác định, bạn có thể viết một ToStringHelper
lớp với phương thức quá tải cho mỗi lớp thư viện mà bạn muốn xử lý theo sở thích của riêng bạn:
public class ToStringHelper {
//... instance configuration here (e.g. punctuation, etc.)
public toString(List m) {
// presentation of List content to your liking
}
public toString(Map m) {
// presentation of Map content to your liking
}
public toString(Set m) {
// presentation of Set content to your liking
}
//... etc.
}
EDIT: Trả lời bình luận của xukxpvfzflbbld, đây là một triển khai có thể cho các trường hợp được đề cập trước đây.
package com.so.demos;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ToStringHelper {
private String separator;
private String arrow;
public ToStringHelper(String separator, String arrow) {
this.separator = separator;
this.arrow = arrow;
}
public String toString(List<?> l) {
StringBuilder sb = new StringBuilder("(");
String sep = "";
for (Object object : l) {
sb.append(sep).append(object.toString());
sep = separator;
}
return sb.append(")").toString();
}
public String toString(Map<?,?> m) {
StringBuilder sb = new StringBuilder("[");
String sep = "";
for (Object object : m.keySet()) {
sb.append(sep)
.append(object.toString())
.append(arrow)
.append(m.get(object).toString());
sep = separator;
}
return sb.append("]").toString();
}
public String toString(Set<?> s) {
StringBuilder sb = new StringBuilder("{");
String sep = "";
for (Object object : s) {
sb.append(sep).append(object.toString());
sep = separator;
}
return sb.append("}").toString();
}
}
Đây không phải là một triển khai đầy đủ, mà chỉ là một khởi đầu.
AbstractCollection@toString
(và do đóString + Stack
) đã in nó như bạn muốn.