2014-03-30 3 views
1

에있는 toString()를 호출하는 방법 : 그것은 제대로 Iterable<Set<String>>를 구현나는이 유사한 클래스가 등 다른 구현/클래스의 자바/

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(); 
    } 
} 

. toString()의 경우 List<Set<String>> 인 것처럼 표시하고 싶습니다. 지금까지 내 솔루션은 위와 같습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? 아니면 올바른 방법입니까? private 멤버 변수는 iterator를 출력 할 상태의 일부이지만, 원하는 것을 얻기 위해 toString()을 호출 할 수있는 멤버가 없습니다.

답변

1

이미 구아바를 사용하는 경우,이 불필요한 복사본을 만들지 않고 ... 하나 개의 라인

return Iterables.toString(this); 

에서 느리게 수행 할 수 있습니다.

+0

항공권입니다. 이제 java8이 생겼습니다. toString은 Iterable의 기본 메소드 일 수 있습니까? – Eyal

0

적어도 잘못된 것은 아닙니다. 이 목록은 명시 적으로 작성되었으므로 작은 유틸리티 메소드로 피할 수 있지만 실제로 이와 같은 것이 중요한 경우는 거의 없습니다. 이미 구아바를 사용하고 있기 때문에

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(' '); 
     } 
    } 
} 
1

,이 시도 :

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

그것은 꽤 많은 전화와 동일 할 것입니다,하지만 복사본을 만들지 않고.

관련 문제