2009-12-27 3 views
2

java.util.Locale은 내가 너무 바보인지 또는 그것을 쓴 사람인지 궁금해하는 수업 중 하나입니다. 마크 데이비스는 주위에 있습니까?java.util.Locale을 어딘지에서 키로 사용하려면 어떻게해야합니까?

내가 알 수있는 한,이 클래스는 사용되지 않아야합니다. 클래스의 내부 캐시는 private입니다. 공장 패키지는 비공개입니다. equals()==을 사용하여 문자열을 비교합니다. 즉, 인스턴스를 직접 만들고 어딘가에 캐시에 저장하고 DRY를 위반하지 않으면 클래스의 인스턴스를 비교할 수 없습니다.

내가 어떻게해야합니까? 이 행동에 대한 제정신의 설명이 있습니까 ???

답변

3

이 모든 것은 생성자에 String이 전달 되었기 때문에 발생합니다. intern() -ed입니다. 의심스러운 관행이지만 그 행동은 결국 정확합니다.


3 인수 생성자는

public Locale(String language, String country, String variant) { 
    this.language = convertOldISOCodes(language); 
    this.country = toUpperCase(country).intern(); 
    this.variant = variant.intern(); 
} 

다음 나중에 주위에이 일을하기 위해지도를 가하고 있습니다 locale.toString()

private String convertOldISOCodes(String language) { 
    // we accept both the old and the new ISO codes for the languages whose ISO 
    // codes have changed, but we always store the OLD code, for backward compatibility 
    language = toLowerCase(language).intern(); 
+0

네 말이 맞아, 나는 그것을 놓쳤다. 불행히도 equals()는 여전히 테스트 케이스에 대해 false를 반환합니다. –

+0

어떤 특정 값이 실패합니까? 나는 간단한 테스트를 마쳤고 나를 위해 패스한다 (단지'새로운 Locale ("en", "EN")'을 사용한다). –

+0

좋아, 찾았습니다 : Db4o에서 로케일을 다시 읽습니다. 즉, 클래스가 깨져서 직렬화되는 것을 의미합니다. 원더풀 ... –

2

당신은 항상 사용할 수 있습니다에 있습니다.

또는 Locale (class LocaleWrapper { private Locale locale; .. })을 랩핑하고 equals 메서드를 올바르게 구현 한 다음 래퍼를 사용할 수 있습니다.