Java 8中MoreObjects的替代方案

时间:2015-09-21 09:12:07

标签: java java-8 guava tostring

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

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

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

5 个答案:

答案 0 :(得分:26)

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

示例:

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

答案 1 :(得分:4)

为什么不自己构建String?代码易于编写和理解,无需使用任何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();
}

答案 2 :(得分:4)

即使在Java-8之前,我也没有理由使用此toStringHelper。简单的实现不再是:

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

答案 3 :(得分:2)

只是提供了一个非常酷的解决方案,让IntelliJ Idea使用StringJoiner生成toString:https://gist.github.com/vlastikcz/6a3b5c158bdb7bf6e9fd(非常感谢作者)
将代码添加到toString模板:按Alt + Insert,选择toString,然后选择除模板之外的设置,使用加号添加: enter image description here

答案 4 :(得分:0)

如果依赖项正常,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