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...)