読み取り専用集合の不変性を破る方法


Github Cottlinに開発されたときに好奇心のある場所を考察した場所
概要
コトリンにはCollectionの読み取り専用コレクションの祖先がいる.
セットの祖先MutableCollectionクラスを変更できます.
ただし、Collectionを継承する読み取り専用コレクションをjavaメソッドに渡すと、不変性が破壊されます.
打ち破ってみる
パラメータとしてList<Integer>型のリストが得られ、以下に示す.
要素を二乗して再格納できるjavaメソッドがあると仮定します.
public class Calculator {
    public static void pow(List<Integer> numberList) {
        for (int i = 0 ; i < numberList.size() ; i++) {
            numberList.set(i, numberList.get(i) * numberList.get(i));
        }
    }
}
コードに読み取り専用リストを作成し、メソッドのパラメータに移動したらどうなりますか?
JavaのCollectionは基本的に読み取り専用ではないからです.
上記の方法では要素を変更できますが、コトリンでは完全に阻止できません.
読み取り専用リストの変更は、次のコードで確認できます.
fun main() {
    val numberList = listOf(1, 2, 3, 4, 5)
    Calculator.pow(numberList)
    numberList.forEach { println(it) }
}
より大きな問題はnullで発生した.
デフォルトでは、宣言がnullを含まないリストがパラメータとして送信されます.
Javaコードにnull値がランダムに格納されている場合は?non-nullタイプでは、nullの値を決定する奇妙なことが発生する可能性があります.
イド・コトリンでは止められないからだ.
使用するjavaコードと統合する際には、これらの要因を十分に考慮する必要があります.
n/a.結論
Javaコードでは、コトリンの読み取り専用コレクションを無視して変更できます.
したがって、javaコードをコードで実行する場合は、特に注意する必要があります.