如何在不同的实现/类/ etc的java中调用toString()

时间:2014-03-30 17:15:01

标签: java inheritance interface tostring

我有一个类似的课程:

class MyClass implements Iterable<Set<String>> {
  @Override
  public Iterator<Set<String>> iterator() {
    //Lots of code here
  }

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

它正确实现了Iterable<Set<String>>。对于toString(),我想将其显示为List<Set<String>>。到目前为止,我的解决方案如上所述。有没有更好的方法来做到这一点,还是这是正确的方法?私有成员变量是输出迭代器的状态的一部分,但是没有一个成员可以调用toString()来获得我想要的东西。

3 个答案:

答案 0 :(得分:1)

由于您已经使用过番石榴,请尝试以下方法:

StringBuilder sb = new StringBuilder("[");
Joiner.on(",").appendTo(this, sb);
return sb.append("]").toString();

它与你的通话几乎完全相同,但没有制作副本。

答案 1 :(得分:1)

如果您已经使用过番石榴,可以在一行中懒散地完成这项工作

return Iterables.toString(this);

......没有做出不必要的复制。

答案 2 :(得分:0)

你在做什么不是&#34;错误&#34;至少。列表是明确构造的,可以通过一个小的实用方法来避免,但很少有这样的事情真的很重要。

class IteratorToString
{
    public static <T> String toString(Iterator<T> iterator)
    {
        if (!iterator.hasNext())
        {
            return "[]";
        }

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        while (true)
        {
            T t = iterator.next();
            sb.append(t);
            if (!iterator.hasNext())
            {
                return sb.append(']').toString();
            }
            sb.append(',').append(' ');
        }
    }
}