假设我有一个这样的类(并进一步假设所有私有变量:
public class Item { private String _id = null; private String _name = null; private String _description = null; ... }
现在,如果要构建此类的toString()表示形式,则可以在Item类中执行以下操作:
@Override public String toString() { return (_id + " " + _name + " " + _description); }
但是,如果我在类中说了15个私有变量,该怎么办?我是否需要像这样写出每个变量的名称?
理想情况下,我想遍历该类的私有变量列表并构造字符串表示形式来结束任务:
@Override public String toString() { ArrayList<String> members = getClass().getMembers(); //Some method like this String string = ""; for(...) string += members[i] + " "; }
也许是toJSON方法,我仍然需要访问这些变量的名称。有什么建议?
您可以这样做:
@Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(getClass().getName()); sb.append(": "); for (Field f : getClass().getDeclaredFields()) { sb.append(f.getName()); sb.append("="); sb.append(f.get(this)); sb.append(", "); } return sb.toString(); }
不要 使用字符串串联来构造15个数据成员的最终结果,特别是如果toString()将调用很多。内存碎片和开销可能确实很高。使用StringBuilder构建大动态的字符串。
toString()
StringBuilder
我通常让我的IDE(IntelliJ)toString()为我简单地生成方法,而不是为此使用反射。
另一种有趣的方法是使用Project Lombok中的@ToString批注:
import lombok.ToString; @ToString(excludes="id") public class ToStringExample { private static final int STATIC_VAR = 10; private String name; private Shape shape = new Square(5, 10); private String[] tags; private int id; @ToString(callSuper=true, includeFieldNames=true) public static class Square extends Shape { private final int width, height; public Square(int width, int height) { this.width = width; this.height = height; } } }
我发现这比Jakarta Commons toString构建器更可取,因为这种方法具有更高的可配置性,并且也是在编译时而非运行时构建的。