2013-04-09 6 views
0

우리는 큰 텍스트 블록을 구성하고 있으며 StringBuilder의 단일 인스턴스를 사용하고 있습니다. 우리는 텍스트 블록을 하위 섹션 (5)으로 분해하고 각각의 해당 메소드를 지정했습니다. 각 메소드는 입력 변수를 가져 와서 텍스트를 출력합니다.StringBuilder를 사용하여 주어진 상황에서 문자열을 작성하는 가장 좋은 방법은 무엇입니까?

각 메서드에 StringBuilder 개체를 전달하고 메서드에 데이터를 추가하고 void를 반환하는 것이 더 좋습니까? 아니면 각 메서드가 더 작은 함수 외부에서 개체에 추가하는 문자열을 반환하도록할까요?

두 아이디어의 장점/단점은 무엇입니까?

+0

그냥 추가를 사용

을 만들어 나중에 추가 할 +를 사용하여 같은

크기 조정 오버 헤드를 피하려면 [StringBuilder (int capacity)] (http://docs.oracle.com/javase/6/docs/api/java/lang/StringBuilder.html#StringBuilder (int))를 사용하십시오. 또한 템플릿 엔진을 사용하지 않는 이유는 무엇입니까? – A4L

답변

4

StringBuilder을 전달하고 직접 추가 할 수 있습니다. 다른 이유로 인해 중간 문자열이 실제로 필요 없다고 가정하면 직접 추가 할 수 있습니다.

StringBuilder을 사용하는 요점은 필요한 것보다 많은 문자열을 만드는 것을 피하는 것입니다.

단지 반환 문자열의 가장 큰 장점은 당신이 이제까지 당신이 StringBuilder에 추가 하지있어 상황에서 동일한 코드를 사용하려는 경우, 더 편리하고 관용적 점이다. 그러나 저는 이것이 실제로는 "텍스트 작성"메서드에서 호출 된 private 메서드라고 가정하고 있습니다.이 메서드는 문제를 덜 만듭니다.

Zim-Zam의 병렬 처리에 대한 요지는 흥미 롭습니다. 그러나 이 아닌 한 실제로 병렬 처리를 계획하지 않는 한 걱정할 필요가 없습니다.

+0

깨끗한 단위 테스트를 생성하는 것이 더 쉬운 지 궁금합니다. 내 첫 번째 본능은 일반적인 재사용 가능한 코드로 끌어 들이기 때문에 서브셋 함수가 문자열을 뱉어내는 것이었지만 메모리 문제 또한 유효한 포인트이다. – user1500053

+0

@ user1500053 :이 방법을 단위 테스트하는 경우 비공개가 아니라는 의미입니까? –

+0

잠재적으로 공개 일 수 있지만 지금은 아니요. – user1500053

1

추가중인 문자열을 가비지 수집 할 필요가 없기 때문에 StringBuilder를 전달하면 메모리가 더 효율적입니다. 문자열을 동시에 생성 한 다음 순차적으로 추가 할 수 있기 때문에 문자열을 반환하면 병렬 처리가 더욱 편리합니다.

1

고정 문자 그대로 당신이 추가 할의 StringBuilder의

String s1=""; 
s1+="str1"; 
s1+="str2"; 
s1+="str3"; 

및 사용 방법을 모두 StringBuilder를 동적으로 문자열을 추가 할 필요가 선호하는 경우

String s1="str1"+"str2"+"str3"; 

를 사용하는, 그래서 여기에 문자열이 더 나은 컴파일러에 의해 감지되며, 마지막으로 로 변환하십시오. toString(); (컴파일러 최적화가 완료되지 않음) 이상의 개체, 당신은 문자열이 것이 얼마나 큰 추측을 시도 할 수 있습니다 그래서 대답에 StringBilder

관련 문제