今週の午後問題〔解答〕Java 通知メッセージの配信システム 2019 (令和元) 年度

今週の午後問題 では毎週月曜に午後の必須選択問題から 1 問ピックアップして出題し、 解答欄 を設け、読者の皆さまにも解答してもらっています!

今週の午後問題は「 2019 年度 秋期 Java」でしたが、皆さん、手応えはいかがでしょうか?

金曜になりましたので、出題の 解答 と 矢沢久雄さんによる 解説 に加えて、皆さんの正解率を公開します。

今週の午後問題
2019 年度 秋期 Java 通知メッセージの配信システム

解答と解説

設問 1a

正解

プログラムの説明に

Notifier クラスのインスタンスは、シングルトン( Java 仮想計算機内で唯一の存在)である

と示されています。

Notifier クラスの getInstance メソッドは、その名前から、インスタンスの参照を返すものであることがわかります。
Notifier クラスは、 static final な、 INSTANCE フィールドに new Notifier() で得られた Notifier クラスのインスタンスを保持しています。

したがって、 getInstance メソッドが返すのは、 INSTANCE フィールドの値であり、選択肢イが正解です。

設問 1b

正解

空欄 b がある if ブロックは、

devices == null // 利用者名に対する携帯端末名のリストが作成されていない

という条件が “真” のとき実行されます。

この場合には、

divices = new ArrayList<();

で携帯端末名のリストを新たに作成し、 userMobileDivices に user (利用者名)と divices を登録します。

したがって、空欄 b の行で行う処理は、

userMobileDivices.put(user, devices)

であり、選択肢オが正解です。

設問 1c

正解

空欄 c がある if ブロックは、

messageList == null // デバイス名に対するメッセージのリストが作成されていない

という条件が “真” のとき実行されます。

この場合には、

messageList = new ArrayList<>();

でメッセージのリストを新たに作成し、 messagesToDeliver に device (携帯端末名)と messageList を登録します。

したがって、空欄 c の行で行う処理は、

messagesToDeliver.put(device, messageList)

であり、選択肢イが正解です。

設問 1d

正解

メソッド名() "[  d  ]" 例外クラス名 { }

という構文なので、空欄 d に入るのは、 throws です。

したがって、選択肢オが正解です。

設問 1e

正解

図 1 に示された実行結果の例を見ると、

phone: [You have a message]
tablet: [You have a message]

という形式で表示されています。

したがって、空欄 e に入るのは、携帯端末名です。

createUserMobileDevice メソッドの説明を見ると、

利用者名と携帯端末名を登録して

と示されているので、このメソッドの引数 user が利用者名であり、引数 name が携帯端末名です。

したがって、空欄 e は name であり、選択肢ウが正解です。

設問 2

正解

α の前で

notifier.shutdown();

という処理が行われています。プログラムの説明に

メソッド shutdown は、通知システムを停止する。未配信の全メッセージ、全利用者名及び全携帯端末名の登録情報を削除し、登録されている全携帯端末の待ち受け状態を解除する

と示されています。

この状態で、 α の位置で

notifier.send("Taro", "You have 2 messages.");

を実行すると、全利用者名の登録情報が削除されているので、 send メソッドの

if (userMobileDevices.contaninsKey(user))

が “偽” となり、 if ブロックの処理が行われません。

devices も空のままになるので、その後にある

for (MobileDevice device : devices)

の処理も行われません。 send メソッドは、何もせずに終了することになります。例外も発生しません。

したがって、選択肢オが正解です。

みんなの解答

では、皆さん、手応えはいかがだったでしょうか?

なお、以下はこの問題の IPA の講評です。今後の参考になれば幸いです。

 問 11 では,携帯端末へ非同期でメッセージを擬似的に通知する処理を題材に,複数スレッド間でデータを更新する処理などについて出題した。
 設問 1 では, a , c , d の正答率は平均的で,おおむね理解されていた。 b の正答率は低く,エと誤って解答した受験者が多く見受けられた。二つの Map の内容の構造的な関係を理解した上で, device と devices で表しているものが異なることに注意すれば,正答できた。 e の正答率は低く,イと誤って解答した受験者が見受けられた。引数のラムダ式の評価は,クラス MobileDevice のコンストラクタの呼出し前に行われることに注意が必要である。
 設問 2 では,正答率は低く,エと誤って解答した受験者が見受けられた。メソッド send では,引数で指定された利用者名が登録されているかどうかを,必ず確認してから処理を行っていることに注意が必要である。
 Java では,スレッド間で同期処理を行うための機能が言語仕様レベルで備えられているので,それらを基礎的な技術として習得しておくことは重要である。一方,コンピュータの高性能化に伴い,基本的な同期処理の機能では実現できない高度な並列処理及び並行処理を行うための機能の利用が要求されることも多く,それらについても学習するようにしてほしい。

来週から午後問題は分野を「情報セキュリティ」に絞って出題します!ぜひ挑戦してみてください!

label 関連タグ
Q. 午前試験を
『免除』するには?
A. 独習ゼミで午前免除制度を活用しましょう。
免除試験を受けた 87% の方が、
1 年間の午前免除資格を得ています。
2022 年 上期 試験向け
コース申込受付中!
info_outline
2022 年 上期 試験向け
コース申込受付中!
詳しく見てみるplay_circle_filled
label これまでの『今週の午後問題』の連載一覧 label 著者