위의 답변에서 이미 언급 한 두 가지 이유를 간략히 설명 하는 좋은 기사 입니다.
- 보안 : 시스템은 변경 될 걱정없이 민감한 읽기 전용 정보를 전달할 수 있습니다.
- 성능 : 불변의 데이터는 스레드 안전을 만드는 데 매우 유용합니다.
그리고 이것은 아마도 그 기사에서 가장 자세한 주석 일 것입니다. Java 및 보안 문제의 문자열 풀과 관련이 있습니다. 문자열 풀에 들어갈 내용을 결정하는 방법에 대해 설명합니다. 문자의 순서가 동일하면 두 문자열이 동일하다고 가정하면 누가 먼저 보안 문제에 도달하는지에 대한 경쟁 조건이 있습니다. 그렇지 않은 경우, 문자열 풀에는 중복 문자열이 포함되므로 우선 문자열을 사용하는 이점을 잃게됩니다. 그냥 읽어 보시겠습니까?
문자열을 확장하면 같고 인턴으로 혼란 스러울 수 있습니다. JavaDoc은 다음과 같습니다.
이 문자열을 지정된 객체와 비교합니다. 인수가 널이 아니고이 오브젝트와 동일한 문자 시퀀스를 나타내는 String 오브젝트 인 경우에만 결과가 참입니다.
java.lang.String
최종이 아니라고 가정하면 SafeString
a String
와 같고 그 반대도 가능합니다. 그것들은 동일한 문자 시퀀스를 나타 내기 때문입니다.
당신이 적용하면 어떻게 될까 intern
A를 SafeString
- 것 SafeString
JVM의 문자열 풀로 이동? ClassLoader
모두는 개체를 SafeString
다음 JVM의 수명 동안 제자리에 고정 얻을 것이다으로 보류 참조. 캐릭터 시퀀스를 처음으로 인턴 할 수있는 사람에 대한 경쟁 조건이 생길 수 있습니다. 어쩌면 당신 SafeString
이 이길 수도 있고 String
, 또는 SafeString
다른 클래스 로더에 의해로드 될 수도 있습니다 (따라서 다른 클래스).
당신이 수영장에서 레이스에서 우승했다면, 이것은 진정한 싱글 톤 일 것 secretKey.intern().getClass().getClassLoader()
입니다.
또는 JVM은 구체적인 String 객체 (하위 클래스는 없음) 만 풀에 추가되도록하여이 구멍을 차단할 수 있습니다.
등호가 같은 구현 된 경우 있음 SafeString
! = String
다음 SafeString.intern
! = String.intern
및 SafeString
풀에 추가되어야 할 것이다. 그러면 수영장이 <Class, String>
대신 수영장이되며 수영장에 <String>
들어가기 위해 필요한 것은 새로운 클래스 로더입니다.