자바의 최종 배열
Java의 다음 코드는 final
배열을 사용하며 이에 String
대한 질문이 없습니다.
final public class Main {
public static final String[] CONSTANT_ARRAY = {"I", "can", "never", "change"};
public static void main(String[] args) {
for (int x = 0; x < CONSTANT_ARRAY.length; x++) {
System.out.print(CONSTANT_ARRAY[x] + " ");
}
}
}
콘솔에 다음 출력을 표시합니다.
I can never change
다음 코드도 질문없이 진행됩니다.
final public class Main {
public static final String[] CONSTANT_ARRAY = {"I", "can", "never", "change"};
public static void main(String[] args) {
//CONSTANT_ARRAY={"I", "can", "never", "change"}; //Error - can not assign to final variable CONSTANT_ARRAY.
for (int x = 0; x < CONSTANT_ARRAY.length; x++) {
System.out.print(CONSTANT_ARRAY[x] + " ");
}
}
}
분명히 주석 처리 된 줄은 선언 final
된 유형의 배열 을 다시 할당하려고하기 때문에 지정된 오류를 발생시킵니다 String
.
다음 코드는 어떻습니까?
final public class Main {
public static final String[] CONSTANT_ARRAY = {"I", "can", "never", "change"};
public static void main(String[] args) {
CONSTANT_ARRAY[2] = "always"; //Compiles fine.
for (int x = 0; x < CONSTANT_ARRAY.length; x++) {
System.out.print(CONSTANT_ARRAY[x] + " ");
}
}
}
그리고 그것은 I can always change
우리가 final
유형 배열의 값을 수정할 수 있다는 것을 의미합니다 String
. 규칙을 위반하지 않고 이러한 방식으로 전체 배열을 수정할 수 있습니까 final
?
final
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
댓글에서 추가하려면 수정 : 내가 할당하고있는 개체를 언급 했습니다 . Java에서 배열은 객체입니다. 이것은 다른 모든 개체에도 동일하게 적용됩니다.
final List<String> myList = new ArrayList<String>():
myList = anotherList; // error, you can't do that
myList.add("Hi there!"); // perfectly fine.
최종 구현을 잘못 해석하고 있습니다. final
이는 배열 객체 참조에 적용됩니다. 즉, 일단 시작되면 참조는 변경할 수 없지만 배열 자체는 채울 수 있습니다. "규칙을 위반하지 않음"에 따라 작동하는 참조 변경에 대해 하나의 규칙 만 지정했습니다. 값이 절대 변경되지 않도록하려면 변경 불가능한 목록으로 이동해야합니다.
List<String> items = Collections.unmodifiableList(Arrays.asList("I", "can", "never", "change"));
배열 참조를 변경할 수 없도록 만들 수만 있습니다. 요소를 변경할 수 없도록하려면 수정 불가능한 컬렉션을 사용해야합니다.
배열을 final로 선언하면 배열의 요소를 변경할 수 있지만이 배열의 참조는 변경할 수 없습니다.
final은 프리미티브의 불변성을 보장합니다. 또한 변수가 한 번만 할당되도록 보장합니다. 객체가 변경 가능하면 final로 정의한 이벤트의 내용을 변경할 수 있습니다. 필요에 따라 변경할 수없는 컬렉션을 확인할 수 있습니다. Collections.unmodifiableList () http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#unmodifiableList(java.util.List )
배열 객체에 대한 참조는 최종입니다 (예 : 다른 Java 배열 객체 (String []의 인스턴스)를 동일한 최종 변수에 연결하려고 시도하는 경우 변경할 수 없음 ... 컴파일 시간 오류가 발생 함).
그러나 예제의 최종 배열 객체의 필드는 최종적이지 않으므로 값을 수정할 수 있습니다. ... 생성 한 Java 객체 인 CONSTANT_ARRAY는 초기 값을받은 후 JVM이 중지 될 때까지 "영구"== 값을 갖게됩니다. :) 동일한 문자열 배열 인스턴스 "영원히"입니다.
Java의 최종 변수는 큰 문제가 아니므로 주제 / 아이디어를주의 깊게 이해하는 데 시간을 할애하십시오. :-)
이 페이지를 묵상하는 것이 불확실한 모든 사람들에게 제안합니다. 예 : https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12 .4
각 부분을 인용하겠습니다.
"Once a final variable has been assigned, it always contains the same value. If a final variable holds a reference to an object, then the state of the object may be changed by operations on the object, but the variable will always refer to the same object.
This applies also to arrays, because arrays are objects; if a final variable holds a reference to an array, then the components of the array may be changed by operations on the array, but the variable will always refer to the same array."
The value of the variable CONSTANT_ARRAY cannot change. That variable contains a (reference to an) array. However, the contents of the array can change. Same thing happens when you declare any kind of final variable that is not a simple scalar type (e.g. an object).
Be careful how you name your variables. :-) Calling it a CONSTANT_ARRAY doesn't make the contents of the array unchangeable.
Here's a good reference: The final word on final
final int[] res;
int[] res1;
int[] res2 = new int[1];
res2[0]=20;
res1=res2;
res1=res2;//no error
System.out.println("res1:"+res1[0]);
res = res2;//only once
//res = res2;//error already initialised
res2[0]=30;
System.out.println("res:"+res[0]);
output:: res1:20 res:30
ReferenceURL : https://stackoverflow.com/questions/10339930/final-array-in-java
'programing' 카테고리의 다른 글
Java : 배열의 하위 집합을 선택하는 쉬운 방법이 있습니까? (0) | 2021.01.18 |
---|---|
일별 데이터를 월 / 년 간격으로 집계 (0) | 2021.01.18 |
C #에서 저장 프로 시저 출력 매개 변수 사용 (0) | 2021.01.18 |
이미 존재하는 프로그램 유형 : android.support.v4.app.BackStackRecord (0) | 2021.01.17 |
android_metadata와 같은 테이블이 없습니다. 문제가 무엇입니까? (0) | 2021.01.17 |