一尘不染

Java:获取类的属性以构造字符串表示形式

java

假设我有一个这样的类(并进一步假设所有私有变量:

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方法,我仍然需要访问这些变量的名称。有什么建议?


阅读 232

收藏
2020-12-03

共1个答案

一尘不染

您可以这样做:

@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构建大动态的字符串。

我通常让我的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构建器更可取,因为这种方法具有更高的可配置性,并且也是在编译时而非运行时构建的。

2020-12-03