Java 8中MoreObjects的替代方案

Cos*_*tin 7 java tostring guava java-8

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

有没有简单和/或优雅的方法来toString()使用Java 8本机函数重写以下函数?

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

小智 26

你可以StringJoinerjava.util包中使用.

例:

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

  • 请注意,`Class#getSimpleName()`安静得很慢. (2认同)

Tag*_*eev 7

toStringHelper即使在 Java 8 之前,我也看不出有任何理由使用它。简单的实现不再是:

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

  • @sdgfsdh,你有证据吗? (5认同)
  • @Tunaki,实际上,如果 [indify Strings](http://openjdk.java.net/jeps/8085796) JEP 将成功推进到 Java-9,我的解决方案实际上会比 StringBuilder 解决方案更高效。 (5认同)
  • @sdgfsdh 我认为编译器会优化它,生成的字节码将与使用 StringBuilder 相同(因为 + 不在循环中) (4认同)
  • @sdgfsdh,你能说出至少一个提供效率较低的解决方案的编译器吗? (3认同)
  • 即使您遇到编译器创建基于`concat` 的代码,垃圾也不会比原始`MoreObjects` 构建器代码的垃圾大。而且您仍然不太可能注意到性能差异;如果该方法成为热点,JVM 就会知道如何优化“concat”操作序列…… (3认同)