変更不可能なリストを返すことは良い考えです。ただし、getterメソッドの呼び出し中に変更できなくなったリストは、クラスまたはクラスから派生したクラスによって変更される可能性があります。
代わりに、クラスを拡張する人には、リストを変更してはならないことを明確にする必要があります。
したがって、あなたの例では次のコードにつながる可能性があります:
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Test {
public static final List<String> STRINGS =
Collections.unmodifiableList(
Arrays.asList("1", "2"));
public final List<String> getStrings() {
return STRINGS;
}
}
上記の例では、STRINGS
フィールドを公開しましたが、値はすでにわかっているので、原則としてメソッド呼び出しは不要です。
またprivate final List<String>
、クラスインスタンスの構築中に変更不可能なフィールドに文字列を割り当てることもできます。(コンストラクターの)定数またはインスタンス化の引数の使用は、クラスの設計によって異なります。
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Test {
private final List<String> strings;
public Test(final String ... strings) {
this.strings = Collections.unmodifiableList(Arrays
.asList(strings));
}
public final List<String> getStrings() {
return strings;
}
}
final
はできません。ただし、Object
フィールドによる参照の変更を防ぐのはより複雑です。