static final을 사용하는 대신 String과 같은 불변 객체의 실제 이점은 무엇입니까?

0__1

내 말은, 사실상 불변 객체가 존재하는 이유는 무엇입니까? 최종 정적 수정 자만 사용하지 않는 이유는 무엇입니까? Java가 변경 불가능하게 만드는 String에 대해 중요한 것은 무엇입니까?

네이선 휴즈

변수를 final로 설정하면 해당 참조를 변경할 수 없습니다. 그러나 참조가 가리키는 객체는 여전히 변경 될 수 있으므로 정의하면 다음과 같습니다.

final List<String> list = new ArrayList<String>();

목록을 다른 목록으로 바꿀 수는 없지만 목록의 내용은 계속 수정할 수 있습니다.

list.add("asdf");

그러나 불변 객체는 일단 생성되면 변경할 수 없습니다.

(정적 만 사용한다는 것은 필드가 인스턴스가 아니라 클래스에서 정의된다는 것을 의미합니다. 상수 값을 정의하는 데 사용되지만 (더욱 열거 형이 추가되기 전에) 클래스에 하나의 값만 필요하기 때문에 만 사용됩니다. 정적 키워드는 다음과 직접 관련이 없습니다. 불변성.)

불변 객체는 스레드로부터 안전하며 객체의 상태가 생성시 안전하게 게시되기 때문에 메모리 가시성, 손실 된 업데이트 등에 대한 우려는 적용되지 않습니다.

상태 변경이 없기 때문에 추론하기 쉽습니다. 가치 기반 평등을 가진 사물의 경우 불변성이 설명되는 개념과 더 잘 일치합니다. 변하지 않는 추상화 인 문자열과 숫자의 경우 불변성이 특히 적절합니다.

변경 가능한 필드가 equals 및 hashCode 구현에 참여하는 변경 가능한 객체가있는 경우 컬렉션에 넣은 다음 필드를 변경하여 컬렉션 작동 방식을 깨는 상황이 발생할 수 있습니다. 그런 종류의 것을 미리 피하는 것이 좋습니다.

또한 불변 객체는 공유하기에 더 안전합니다. Java Concurrency in Practice , 3.4를 참조하십시오 .

변경 불가능한 객체도 더 안전합니다. 신뢰할 수없는 코드에 변경 가능한 개체를 전달하거나 신뢰할 수없는 코드가 찾을 수있는 곳에 게시하는 것은 위험합니다. 신뢰할 수없는 코드는 상태를 수정하거나 더 나쁜 경우에는 참조를 유지하고 나중에 다른 스레드에서 상태를 수정할 수 있습니다. 반면에 변경 불가능한 개체는 악성 코드 나 버그가있는 코드에 의해 이러한 방식으로 전복 될 수 없으므로 방어적인 복사본을 만들 필요없이 자유롭게 공유하고 게시 할 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

MSI 대신 MSM을 사용할 때의 제한 / 이점은 무엇입니까?

분류에서Dev

객체 유형을 사용하는 대신 메소드 매개 변수로 제네릭 유형 인수를 사용하는 사용법은 무엇입니까?

분류에서Dev

Nuxt 2.14 범용 모드에서 target : 'static'과 target : 'server'의 실제 차이점은 무엇입니까?

분류에서Dev

대체 잠금 화면 배경을 사용하는이 방법의 문제점은 무엇입니까?

분류에서Dev

대체 잠금 화면 배경을 사용하는이 방법의 문제점은 무엇입니까?

분류에서Dev

"b.example / a"대신 "abexample"과 같은 URL의 차이점은 무엇입니까?

분류에서Dev

버전 대신 Mac 운영 체제의 실제 이름을 얻는 방법은 무엇입니까?

분류에서Dev

서브 쉘에서 실행하는 것과 & 대 coproc 명령을 사용하는 것의 차이점은 무엇입니까?

분류에서Dev

{{STATIC_URL}}과 {% static %} 사용의 차이점은 무엇입니까?

분류에서Dev

{{STATIC_URL}}과 {% static %} 사용의 차이점은 무엇입니까?

분류에서Dev

Java에서 복제 된 객체와 원래 객체의 차이점을 찾는 방법은 무엇입니까?

분류에서Dev

scikit-learn DecisionTreeRegressor에서 "X"대신 실제 기능 이름을 사용하는 방법은 무엇입니까?

분류에서Dev

ArrayListMultimap과 같은 맵을 가지지 만 RangeSet과 "합체"를 대신 사용하는 방법이 있습니까?

분류에서Dev

Linux 대신 QNX 또는 VxWorks와 같은 RTOS를 사용할 때의 이점은 무엇입니까?

분류에서Dev

Netbeans의 불확실한 진행 막대 스타일을 사용하는 방법은 무엇입니까?

분류에서Dev

파일 시스템 변경을 수신하는 대시 루프의 CPU 사용량을 제한하는 방법은 무엇입니까?

분류에서Dev

실제 null 값 대신 빈 문자열을 사용하는 방법은 무엇입니까?

분류에서Dev

'키보드 인터럽트 제외'대신 LCD의 버튼을 사용하는 방법은 무엇입니까?

분류에서Dev

PLSQL에서 'execute'를 사용하여 쿼리 문을 실행하는 것과 Directy를 사용하는 것의 차이점은 무엇입니까?

분류에서Dev

functionName ()을 사용하여 변수 값을 할당하는 것과 functionName 만 사용하는 것의 차이점은 무엇입니까?

분류에서Dev

이름 대신 객체의 값을 지속적으로 저장하는 방법은 무엇입니까?

분류에서Dev

int (* ptr) [4]가 실제로 의미하는 것은 무엇이며 * ptr과 다른 점은 무엇입니까?

분류에서Dev

Join과 subquery로 같은 일을하는 것의 차이점은 무엇입니까?

분류에서Dev

복잡한 이름을 가진 전역 변수와 검색에 사용되는 입력 필드의 실제 차이점은 무엇입니까?

분류에서Dev

유닛을 사용하는 것과 사용하지 않는 것의 차이점은 무엇입니까?

분류에서Dev

@ Html.DisplayFor를 사용하는 것과 @Model을 사용하는 것의 차이점은 무엇입니까?

분류에서Dev

method.invoke를 사용하는 것과 Java에서 공용 메소드에 대한 메소드를 실행하는 것의 차이점은 무엇입니까?

분류에서Dev

몽구스를 사용하여 객체 대신 배열을 얻는 방법은 무엇입니까?

분류에서Dev

객체 대신 블록으로 IN을 사용하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    MSI 대신 MSM을 사용할 때의 제한 / 이점은 무엇입니까?

  2. 2

    객체 유형을 사용하는 대신 메소드 매개 변수로 제네릭 유형 인수를 사용하는 사용법은 무엇입니까?

  3. 3

    Nuxt 2.14 범용 모드에서 target : 'static'과 target : 'server'의 실제 차이점은 무엇입니까?

  4. 4

    대체 잠금 화면 배경을 사용하는이 방법의 문제점은 무엇입니까?

  5. 5

    대체 잠금 화면 배경을 사용하는이 방법의 문제점은 무엇입니까?

  6. 6

    "b.example / a"대신 "abexample"과 같은 URL의 차이점은 무엇입니까?

  7. 7

    버전 대신 Mac 운영 체제의 실제 이름을 얻는 방법은 무엇입니까?

  8. 8

    서브 쉘에서 실행하는 것과 & 대 coproc 명령을 사용하는 것의 차이점은 무엇입니까?

  9. 9

    {{STATIC_URL}}과 {% static %} 사용의 차이점은 무엇입니까?

  10. 10

    {{STATIC_URL}}과 {% static %} 사용의 차이점은 무엇입니까?

  11. 11

    Java에서 복제 된 객체와 원래 객체의 차이점을 찾는 방법은 무엇입니까?

  12. 12

    scikit-learn DecisionTreeRegressor에서 "X"대신 실제 기능 이름을 사용하는 방법은 무엇입니까?

  13. 13

    ArrayListMultimap과 같은 맵을 가지지 만 RangeSet과 "합체"를 대신 사용하는 방법이 있습니까?

  14. 14

    Linux 대신 QNX 또는 VxWorks와 같은 RTOS를 사용할 때의 이점은 무엇입니까?

  15. 15

    Netbeans의 불확실한 진행 막대 스타일을 사용하는 방법은 무엇입니까?

  16. 16

    파일 시스템 변경을 수신하는 대시 루프의 CPU 사용량을 제한하는 방법은 무엇입니까?

  17. 17

    실제 null 값 대신 빈 문자열을 사용하는 방법은 무엇입니까?

  18. 18

    '키보드 인터럽트 제외'대신 LCD의 버튼을 사용하는 방법은 무엇입니까?

  19. 19

    PLSQL에서 'execute'를 사용하여 쿼리 문을 실행하는 것과 Directy를 사용하는 것의 차이점은 무엇입니까?

  20. 20

    functionName ()을 사용하여 변수 값을 할당하는 것과 functionName 만 사용하는 것의 차이점은 무엇입니까?

  21. 21

    이름 대신 객체의 값을 지속적으로 저장하는 방법은 무엇입니까?

  22. 22

    int (* ptr) [4]가 실제로 의미하는 것은 무엇이며 * ptr과 다른 점은 무엇입니까?

  23. 23

    Join과 subquery로 같은 일을하는 것의 차이점은 무엇입니까?

  24. 24

    복잡한 이름을 가진 전역 변수와 검색에 사용되는 입력 필드의 실제 차이점은 무엇입니까?

  25. 25

    유닛을 사용하는 것과 사용하지 않는 것의 차이점은 무엇입니까?

  26. 26

    @ Html.DisplayFor를 사용하는 것과 @Model을 사용하는 것의 차이점은 무엇입니까?

  27. 27

    method.invoke를 사용하는 것과 Java에서 공용 메소드에 대한 메소드를 실행하는 것의 차이점은 무엇입니까?

  28. 28

    몽구스를 사용하여 객체 대신 배열을 얻는 방법은 무엇입니까?

  29. 29

    객체 대신 블록으로 IN을 사용하는 방법은 무엇입니까?

뜨겁다태그

보관