finalなListでaddできちゃう問題
とあるコードが数字→英数字になる仕様変更に取り組んだときの、気づきと備忘録、その2。
正規表現は満たしていても、NGにするコードが、仕様としていくつか含まれている。
その仕様を含んだ実装。
final List<String> NG_CODE_LIST = new ArrayList<String>(); { NG_CODE_LIST.add("000"); NG_CODE_LIST.add("999"); } if(targetCode.matches("^[0-9a-zA-Z]{3}+$") && !NG_CODE_LIST.contains(targetCode)) { // コードのチェック仕様を満たしている場合の処理 } else { // コードのチェック仕様を満たしていない場合の処理 }
finalなのにadd?
finalで定数であることは宣言してるから…ってそれでいいのか?
腑に落ちなかったので、"final list java"でググって調べたところ、以下の記事を発見。
neos21.hatenablog.com
final List<String> NG_CODE_LIST = Collections.unmodifiableList(Arrays.asList("000", "999")); if(targetCode.matches("^[0-9a-zA-Z]{3}$") && !NG_CODE_LIST.contains(targetCode)) { // コードのチェック仕様を満たしている場合の処理 } else { // コードのチェック仕様を満たしていない場合の処理 }
この実装なら、NG_CODE_LISTにaddしようものなら例外が発生するようになる、ということらしい。
厳密に禁止したいときはこちらの方がよさげ。
あとついでに、Arrays.asListにしてみた。
可変(ArrayList)である必要ないし、問題ないよね?
https://docs.oracle.com/javase/jp/6/api/java/util/Arrays.html#asList(T...)