在 Java 8 中替代 MoreObjects

Alternative to MoreObjects in Java 8

我想摆脱这种依赖:import com.google.common.base.MoreObjects;

是否有任何简单的and/or优雅的方法来使用Java 8 个本机函数重写以下toString() 函数?

@Override
public String toString() {
  return MoreObjects
    .toStringHelper(this)
    .add("userId", this.userId)
    .add("timestamp", this.timestamp)
    .toString();
}

为什么不自己构建字符串?代码易于编写和理解,无需使用任何 Java 8 个特定功能。

@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append(getClass().getSimpleName()).append('{')
    sb.append("userId=").append(userId);
    sb.append(", timestamp=").append(timestamp);
    return sb.append('}').toString();
}

您可以使用 java.util 包中的 StringJoiner

示例:

@Override
public String toString() {
    return new StringJoiner(", ", ClassName.class.getSimpleName() + "[", "]")
    .add("userId=" + userId)
    .add("timestamp=" + timestamp)
    .toString();
}

我看不出有任何理由使用这个 toStringHelper 甚至在 Java 之前 8. 简单的实现不再:

@Override
public String toString() {
    return getClass().getSimpleName()+"["
          +"userId: "+this.userId+", "
          +"timestamp: "+this.timestamp
          +"]";
}

只是提供了一个非常酷的解决方案,让 IntelliJ Idea 使用 StringJoiner 生成 toString:https://gist.github.com/vlastikcz/6a3b5c158bdb7bf6e9fd(非常感谢作者)
将代码添加到toString模板中:按Alt+Insert,select toString,然后select Settings besides Templates,加上加号:

如果依赖关系正常,Apache commons-lang3 有 ToString 助手:

@Override
public String toString() {
    return new ToStringBuilder(this).
    append("name", name).
    append("age", age).
    append("smoker", smoker).
    toString();
}

@Override
public String toString() {
    return ReflectionToStringBuilder.toString(this);
}

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/package-summary.html