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

如何在不同实现/类/etc的java中调用toString(),java,inheritance,interface,tostring,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).to

我有一个类似的课程:

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();
  }
}
类MyClass实现了Iterable{
@凌驾
公共迭代器迭代器(){
//这里有很多代码
}
@凌驾
公共字符串toString(){
返回ImmutableList.copyOf(this.toString();
}
}
它正确地实现了
Iterable
。对于
toString()
,我希望将其显示为一个
列表。到目前为止,我的解决方案如上所述。有没有更好的方法,或者这是正确的方法?私有成员变量是输出迭代器的状态的一部分,但是没有一个成员可以调用
toString()
来获得我想要的。

您所做的至少不是“错误的”。列表是显式构造的,这可以用一个小的实用方法来避免,但是很少有这样的情况真正重要

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(' ');
        }
    }
}
类迭代器排序
{
公共静态字符串toString(迭代器迭代器)
{
如果(!iterator.hasNext())
{
返回“[]”;
}
StringBuilder sb=新的StringBuilder();
某人附加(“[”);
while(true)
{
T=迭代器.next();
某人附加(t);
如果(!iterator.hasNext())
{
返回sb.append(']').toString();
}
某人附加(‘,’)。附加(‘’);
}
}
}

既然您已经在使用番石榴,请尝试以下方法:

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

它的功能与您的通话基本相同,但无需复制。

如果您已经在使用番石榴,可以在一行中惰性地完成

return Iterables.toString(this);

…而不制作不必要的副本。

就是这样!既然我们有了java8,也许toString可以成为Iterable中的默认方法?