※本記事は、Simon Roberts、Mikalai Zaikinによる”Quiz Yourself: Read and Set the Locale (Advanced)“を翻訳したものです。


ユーザーの満足のために、正確なロケール設定を

著者:Simon Roberts、Mikalai Zaikin

2019年10月4日

その他の設問はこちらから

過去にこのクイズの設問に挑戦したことがある方なら、どれ1つとして簡単な問題はないことをご存じでしょう。クイズの設問は、認定試験の中でも難しいものに合わせています。「中級者向け」「上級者向け」というレベルは、設問の難易度ではなく、対応する試験による分類です。しかし、ほとんどすべての場合において、「上級者向け」の方が難しくなります。設問は認定試験対策として作成しており、認定試験と同じルールの適用を意図しています。文章は文字どおりに解釈してください。回答者を引っかけようとする設問ではなく、率直に言語の詳細な知識を試すものだと考えてください。

この設問では、Localeオブジェクトを使用してロケールの読取りと設定を行いたいと思います。 

次のうち、正しい選択肢はどれですか。1つ選んでください。

  1. Localeは国と言語の両方を表すことができる
  2. Localeを作成するとき、国は必ず指定しなければならない
  3. 言語は必ず2文字で表される
  4. Localeクラスでは、Localeの新しいインスタンスを作成するのではなく、事前定義されたstatic final定数を常に使うことができる

解答:java.util.Localeクラスでは、地理的、言語的、政治的、および文化的な好みの設定を表しますが、こういった側面のすべてが必要となるわけではありません。ユーザーのニーズと好みの設定に応じて、ソフトウェアでは最適なものを提供できるようにするという考え方です。

たとえば、大半のユーザーは、ユーザー・インタフェースが第一言語または少なくとも自分が理解する言語で提示されることは絶対要件だと考えるでしょう。しかし、日付の年月日の要素が、ユーザーの国で一般的に使われる形式とは違う順序で表示されたとしても、そのソフトウェアを使おうと思ってくれるかもしれません。

その点を考えれば、JavaのLocaleオブジェクトの要素には優先順位が付けられており、言語の優先順位がもっとも高く、地域の優先順位は言語よりも低くなっている点に驚くことはないでしょう。

Localeクラスには、3つのコンストラクタがあります。1つ目は言語のみ、2つ目は言語および国、そして3つ目は、言語および国に加えてvariant要素が必須になっています。コンストラクタを以下に示します。

  • Locale(String language)
  • Locale(String language, String country)
  • Locale(String language, String country, String variant)

ここまでの説明で、2つの重要なポイントに注意してください。

まず、Localeでは言語および国の両方(とさらに別の情報)を表すことができるという点です。そのため、選択肢Aは正解です。

次に、言語は優先順位がもっとも高い要素で、どのコンストラクタでも省略できないものの、地域は二次的要素であり省略できるという点です。Localeの性質を理解すれば(API機能についての知識も参考になるでしょう)、選択肢Bは誤りであることがわかります。

通常、言語は小文字2文字を使って表されます。しかし、標準(厳密に言えば、IETF BCP 47およびISO 639)とAPIドキュメントには、3文字も可能であることが記されています。3文字タグは珍しいですが、APIドキュメントではkok(コンカニ語)が例として挙げられています。さらに、サブタグでは8文字まで拡張することもできます。以上より、選択肢Cは誤りであることがわかります。

コンカニ語は、インドで約700万人が話している言語です。

設問に含まれるこの要素が、知識の丸暗記という、かなり疑わしいカテゴリに入るものであることには注目すべきです。私たちも、試験の作成者も、このような設問は好みません。率直に言えば、このトピックについての設問を、単なる事実に基づかずに作成するのはかなり難しいことです。しかし、Localeの性質と使用方法について十分実務的に理解していれば、即座に完全な自信を持って選択肢Aを選ぶことができ、他の選択肢について悩む必要はないはずです。事実そのものについての知識が必要と思われるさまざまな状況で、このようなことはよくあります。

Java 8のリリースによって、コンストラクタをパブリックAPIの一部として公開することは、多くの場合、あまりよい方法ではないという認識が広がりました。コンストラクタはオブジェクトを作成する際に必要であり、クラスの継承を使いたい場合は、privateでないコンストラクタが必要になります。しかし、パブリックAPIの一部として考えた場合、一般的に言って、コンストラクタをお勧めできないいくつかの理由があります。

その理由の1つに、newの呼出しによって、新しいオブジェクトまたは例外のいずれかしか得られないことが挙げられます。つまり、プールの中にあるオブジェクトを渡すことはできません。現在、Java(または参照ベースの任意の言語)で可変オブジェクトをプールすることは、ほとんどすべての場合において適切ではありません。しかし、可能な値がほどよい範囲である不変オブジェクトをプールしておくことは合理的で、ますます一般的なAPI機能になっています(「実行時に拡張可能な列挙型」を考えてみてください)。

不変オブジェクトの不必要な複製を最低限に抑える方法の1つとして、事前定義された定数を提供するというものがあります。Localeクラスでは、およそ8つの国およびそのバリエーションのいくつかについて、この方法がとられています。しかし、対象となっているすべての国からはほど遠く、すべての組合せにはとても及びません。そのため、選択肢Dは誤りです。

正解は選択肢Aです。

 

Java Magazine 日本版Vol.47の他の記事

Java 13のswitch式と再実装されたSocket APIの内側
Javaにテキスト・ブロックが登場
言語の内側:シールド型
TeaVMを使ってブラウザでJavaを動かす
ツールをよく知る
クイズに挑戦:1次元配列(中級者向け)
クイズに挑戦:カスタム例外(上級者向け)
クイズに挑戦:関数型インタフェース(上級者向け)


Simon Roberts

Simon Roberts:Sun Microsystemsがイギリスで初めてJavaの研修を行う少し前にSunに入社し、Sun認定Javaプログラマー試験とSun認定Java開発者試験の作成に携わる。複数のJava認定ガイドを執筆し、現在はフリーランスでPearson InformITにおいて録画やライブによるビデオ・トレーニングを行っている(直接またはO’Reilly Safari Books Onlineサービス経由で視聴可能)。OracleのJava認定プロジェクトにも継続的に関わっている。

 

Mikalai Zaikin

Mikalai Zaikin:ベラルーシのミンスクを拠点とするIBA IT ParkのリードJava開発者。OracleによるJava認定試験の作成に携わるとともに、複数のJava認定教科書のテクニカル・レビューを行っている。Kathy Sierra氏とBert Bates氏による有名な学習ガイド『Sun Certified Programmer for Java』では、3版にわたってテクニカル・レビューを務めた。