nullによる初期化を回避せよ その2
次のクラスメソッドFoo.hoge(bar)は、barの内容をひらがなに変換するメソッドである。ただし、barがnullの場合はnullを返す。String hiraのnullによる初期化を回避せよ。
public class Foo { public enum Bar {Hoge, Fuga, Piyo}; public static String hoge(Bar bar) { String hira = null; //この初期化を回避せよ switch (bar) { case Hoge: hira = "ほげ"; break; case Fuga: hira = "ふが"; break; case Piyo: hira = "ぴよ"; break; } return hira; } }
知識の再確認や初級者のステップアップにはメソッド単位のリファクタリングが丁度いいかなぁ、というアイデアによりオレオレ大絶賛のシリーズ化。null初期化回避問題のためのメソッドなので色々なツッコミはあるにせよ、…あればぜひ突っ込んでくださいw
解答例は下。
returnでcase句から直接返却しています。何らかの集計用の一時変数ならともかく、単に代入されるだけの一時変数ならreturn句で直接書いちゃった方が、変数の状態を追う必要がないのでシンプルです。ちなみに、集計用の一時変数は適切な初期値を定めるべきです。数値なら0、文字なら""とか。
リソースの取得やループ、条件分岐のブロック階層が入り組んだメソッドで気軽にreturnを繰り返されるとちょっとわけわかんなくなるって思うかもしれないけど、その場合はブロック階層の見直しが先決でしょうね。ブロック海曹。
public class Foo { public enum Bar {Hoge, Fuga, Piyo}; public static String hoge(Bar bar) { switch (bar) { case Hoge: return "ほげ"; case Fuga: return "ふが"; case Piyo: return "ぴよ"; default: return null; } } }