finallyを使用すれば、try/catchどちらの処理を行っていても必ず最後に実行されます。しかし非同期処理中などでfinallyは使用したくないが、同じ処理を行いたい場合もあると思います。そんな時のテクニックをメモ。
方法:1
tryの中で「こんにちは」の条件に当てはまった時、runブロックを使用してreturnします。デメリットはネストが深くなります。
private fun sayGreeting() {
var message = ""
run {
try {
message = "おはよう!"
if (true) {
// 途中で処理を止めて最後の処理を行いたい
message = "こんにちは🖐️"
return@run
}
message = "こんばんは..."
} catch (e: Exception) {
message = ""
}
}
println(message) // こんにちは🖐️
}
方法:2
単純に同じ処理を複数書きます。処理が少ない場合はこれでもいかなと。デメリットはif文の数だけ同じ処理が増え冗長になります。下記コードdは「sup」が出力されます。
private fun sayGreeting() {
var message = ""
try {
message = "おはよう!"
if (false) {
message = "Hello!"
println(message)
return
}
if (true) {
message = "sup"
println(message) // sup
return
}
if (false) {
message = "hi!"
println(message)
return
}
message = "こんばんは..."
} catch (e: Exception) {
message = ""
return
}
println(message)
}