Ответ 1
Класс Locale не накладывает никаких проверок на то, что вы его кормите, но он заменяет некоторые коды языков для своих старых значений. Из документация:
ISO 639 не является стабильным стандартом; некоторые из кодов языка (в частности, "iw", "ji" и "in" ) изменились. Эта конструктор принимает как старые коды ( "iw", "ji", так и "in" ), и новые коды ( "he", "yi" и "id" ), но все остальные API в Locale будут возвращает только OLD-коды.
Здесь конструктор:
public Locale(String language, String country, String variant) {
this.language = convertOldISOCodes(language);
this.country = toUpperCase(country).intern();
this.variant = variant.intern();
}
И вот волшебный метод:
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();
if (language == "he") {
return "iw";
} else if (language == "yi") {
return "ji";
} else if (language == "id") {
return "in";
} else {
return language;
}
}
Объекты, которые он создает, являются неизменными, поэтому нет работы вокруг этого. Класс также final
, поэтому вы не можете его расширять и не имеете определенного интерфейса для реализации. Один из способов сохранить эти коды языков - создать оболочку вокруг этого класса и использовать ее.