Java의 모든 인수는 값으로 전달됩니다. a String
를 함수에 전달하면 전달 된 값 은 String 개체에 대한 참조,하지만 당신은 그 기준을 수정할 수 있으며, 기본 String 객체는 불변이다.
과제
zText += foo;
다음과 같습니다.
zText = new String(zText + "foo");
즉,이 (로컬) 파라미터 재 할당된다 zText
하는 새로운 새로운 메모리 위치를 가리키는 새로운 참조로서 String
원래 포함 된 내용 zText
과 "foo"
첨부한다.
원래 객체는 수정되지 않으며 main()
메서드의 로컬 변수는 zText
여전히 원래 (빈) 문자열을 가리 킵니다.
class StringFiller {
static void fillString(String zText) {
zText += "foo";
System.out.println("Local value: " + zText);
}
public static void main(String[] args) {
String zText = "";
System.out.println("Original value: " + zText);
fillString(zText);
System.out.println("Final value: " + zText);
}
}
인쇄물:
Original value:
Local value: foo
Final value:
문자열을 수정하려는 경우 추가 용도 로 포인터 간접 지정을 제공하는 언급 된 용도 StringBuilder
나 일부 컨테이너 (배열 또는 AtomicReference
사용자 지정 컨테이너 클래스)를 사용할 수 있습니다. 또는 새 값을 반환하고 할당하십시오.
class StringFiller2 {
static String fillString(String zText) {
zText += "foo";
System.out.println("Local value: " + zText);
return zText;
}
public static void main(String[] args) {
String zText = "";
System.out.println("Original value: " + zText);
zText = fillString(zText);
System.out.println("Final value: " + zText);
}
}
인쇄물:
Original value:
Local value: foo
Final value: foo
이것은 일반적인 경우에 가장 Java와 유사한 솔루션 일 것입니다. 효과적인 Java 항목 "Favor immutability"를 참조하십시오 .
그러나 언급했듯이, StringBuilder
종종 루프 내부에서 할 일이 많으면을 사용하여 성능을 향상시킬 수 있습니다 StringBuilder
.
그러나 Strings
가능 StringBuilders
하다면 변경 불가능한 것이 아니라 변경 불가능한 것을 전달 하십시오. 코드를보다 쉽게 읽고 유지 관리 할 수 있습니다. final
메소드 매개 변수를 새 값으로 재 할당 할 때 경고하도록 매개 변수 작성 및 IDE 구성을 고려하십시오 .