배열에 final 키워드를 사용해 보았지만 여전히 배열이 최종을 지원하지 않는 이유 때문에 값을 변경할 수 있습니다.final은 Java의 배열에 적용 할 수없는 이유는 무엇입니까?
미리 감사드립니다.
배열에 final 키워드를 사용해 보았지만 여전히 배열이 최종을 지원하지 않는 이유 때문에 값을 변경할 수 있습니다.final은 Java의 배열에 적용 할 수없는 이유는 무엇입니까?
미리 감사드립니다.
자바의 배열은 참조 유형입니다. 배열 final
을 선언하면 배열에 포함 된 요소가 아니라 배열 객체 참조 자체 final
이 선언됩니다. 따라서 배열 참조를 변경할 수는 없지만 여전히 배열의 개별 요소를 변경할 수 있습니다.
원하는 효과를 얻으려면 Collections.unmodifiableList
또는 비슷한 것을 사용해야합니다.
final은 내용이 아닌 배열 참조에 적용되므로.
배열 내용을 수정할 수는 있지만 배열을 다시 나타낼 수는 없습니다.
배열 은입니다. 다른 참조 변수의 경우도 마찬가지입니다. 변수의 상태는 변경할 수 있지만 변수가 참조하는 객체 (여기서는 배열 객체)는 변경할 수 없습니다. 배열의 경우 상태는 항목 참조입니다.
final int[] test = new int[3];
test = new int[2]; //Error here
그러면 최종 배열을 선언하는 경우 뜻이므로
이
final int a[]={11,2};
int b[]={};
a=b;// this will compile wrong
a[1]=1;//this will compile fine
있다면 (최종 레퍼런스 아닌 오브젝트 데이터에 적용)이 배열 참조 못해 변경할 수는 있지만 내용을 분명히 변경할 수 있습니다.
불변의 데이터 구조가 필요하면 List
(원하는 경우 ArrayList
을 사용할 수 있습니다.) 원하는 장소에 있습니다. 이 실제로 일 경우 배열이되어야하므로 getter 메서드 만 사용하여 자체 데이터 구조를 만들어야합니다.
final in Java는 변수에 영향을 미치며 사용자가 할당 한 객체와 아무 관련이 없습니다.
final String[] myArray = { "hi", "there" };
myArray = anotherArray; // Error, you can't do that. myArray is final
myArray[0] = "over"; // perfectly fine, final has nothing to do with it
어떻게 ArrayList가 "변경 불가능한 데이터 구조"입니까? –
@HovercraftFullOfEels :'ArrayList'의 퍼터 메소드를 오버라이드하여 "불변성"을 적용 할 수 있습니다. 그리고 네, 그것은 일종의 해킹입니다, 나는'Collection'을 사용할 것입니다. – AaronB
Collections.unmodifiableList는, 지정된 List의 변경 불가능한 뷰를 작성합니다. –