2015-09-21 71 views
6

我想MoreObjects摆脱这种依赖性:import com.google.common.base.MoreObjects;替代在Java 8

是否有任何简单的和/或优雅的方式来重写使用Java 8本地函数下面toString()功能?

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

回答

19

您可以使用StringJoinerjava.util包。

例子:

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

我会选择这个解决方案,因为它的清晰度和高雅。我发现'StringBuilder'与'StringJoiner'比较不那么容易理解。简单的'str1 + str2'对我来说太低级(和冗长)。谢谢。 – Costin

+2

请注意,'Class#getSimpleName()'安静缓慢。 – Konsumierer

3

为什么不自己构建字符串?该代码很容易编写和理解,而不使用任何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(); 
} 
+0

是否有'格式化我的地图? – Costin

+3

@Costin,大部分地图都正确实现了'toString()'方法,所以是的。 –

4

我看不出有任何理由使用toStringHelper甚至之前的Java-8。平原实施不再:

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

这将会(编辑:* may *)产生比'StringBuilder'解决方案更多的垃圾。 – sdgfsdh

+5

@sdgfsdh,你有什么证据吗? –

+4

@sdgfsdh我认为编译器会优化它,生成的字节码将与使用StringBuilder相同(因为+不在循环中) – Tunaki

1

就设有一个很酷的解决方案,让IntelliJ IDEA的产生与StringJoiner了toString:https://gist.github.com/vlastikcz/6a3b5c158bdb7bf6e9fd(感谢很多的作者)
的代码添加到的toString模板:按Alt + Insert,选择toString,然后选择Settings Templates除外,加上加号: enter image description here