019-005-007
リソース管理: 連鎖クリーンアップ
上級
問題説明
リソース管理: バリデーション付き連鎖クリーンアップ
この問題では: AutoCloseableを実装したDatabaseConnectionクラスとFileWriterSimクラスを作成し、コンストラクタおよびメソッドに入力バリデーションを実装します。不正な引数に対してはIllegalArgumentExceptionをスローし、有効な引数に対しては処理結果の文字列を返すようにします。MainクラスのprocessQueryメソッドとprocessWriteメソッドはtry-with-resources構文を使ってリソースを管理します。
学習目標: AutoCloseableリソースへの入力バリデーション実装と、try-with-resourcesにおける例外の伝播を理解する
仕様
DatabaseConnectionクラス
AutoCloseableを実装する- コンストラクタ
DatabaseConnection(String host):hostがnullまたは空文字の場合、IllegalArgumentException("Host cannot be null or empty")をスローする- それ以外の場合はホスト名をフィールドに保存する
query(String sql)メソッド:sqlがnullまたは空文字の場合、IllegalArgumentException("SQL cannot be null or empty")をスローする- それ以外の場合は
"Result of [" + sql + "] on " + hostを返す
close()メソッド: リソース解放処理(標準出力への出力は不要)
FileWriterSimクラス
AutoCloseableを実装する- コンストラクタ
FileWriterSim(String filename):filenameがnullまたは空文字の場合、IllegalArgumentException("Filename cannot be null or empty")をスローする- それ以外の場合はファイル名をフィールドに保存する
write(String data)メソッド:dataがnullの場合、IllegalArgumentException("Data cannot be null")をスローする- それ以外の場合は
"Written [" + data + "] to " + filenameを返す
close()メソッド: リソース解放処理(標準出力への出力は不要)
Mainクラス
processQuery(String host, String sql)静的メソッド:- try-with-resources構文で
DatabaseConnectionを生成する db.query(sql)の結果を返す- 例外はそのまま呼び出し元に伝播させる
- try-with-resources構文で
processWrite(String filename, String data)静的メソッド:- try-with-resources構文で
FileWriterSimを生成する writer.write(data)の結果を返す- 例外はそのまま呼び出し元に伝播させる
- try-with-resources構文で
main(String[] args)メソッド: プログラムのエントリーポイント
テスト例
| 呼び出し | 結果 |
|---|---|
processQuery("localhost", "SELECT * FROM users") |
"Result of [SELECT * FROM users] on localhost" |
processWrite("output.txt", "query result") |
"Written [query result] to output.txt" |
processQuery(null, "SELECT * FROM users") |
IllegalArgumentException: Host cannot be null or empty |
processQuery("localhost", "") |
IllegalArgumentException: SQL cannot be null or empty |
processWrite(null, "data") |
IllegalArgumentException: Filename cannot be null or empty |
processWrite("output.txt", null) |
IllegalArgumentException: Data cannot be null |
