Java 不可变集合,同时修复引用

Java Immutable Collection, Fix the reference also

我正在努力创建 ImmutableList Unmodified 将只限于生成的集合,尽管可以修改创建它的集合。

public static void main(String[] args) {
        List<String> strings = new ArrayList<String>();
        // unmodifiable.add("New string");
        strings.add("Aha 1");
        strings.add("Aha 2");
        List<String> unmodifiable = Collections.unmodifiableList(strings);
        // Need some way to fix it so that Strings does not Modify
        strings.add("Aha 3");
        strings.add("Aha 4");

        for (String str : unmodifiable) {
            System.out.println("Reference Modified :::" + str);
        }

        List<List<String>> nCopies = Collections.nCopies(3, strings);
        for (List<String> innerString : nCopies) {
            innerString.add("Aha Inner");
        }

        for (List<String> innerString : nCopies) {

            for (String str : innerString) {
                System.out.println(str);
            }
        }

    }

试试这个。

public class MyList<E> extends AbstractList<E> {

    boolean modifiable = true;
    List<E> list = new ArrayList<>();

    @Override
    public E get(int index) {
        return list.get(index);
    }

    @Override
    public int size() {
        return list.size();
    }

    public boolean getModifialbe() {
        return modifiable;
    }

    public void setModifiable(boolean modifiable) {
        this.modifiable = modifiable;
    }

    @Override
    public boolean add(E e) {
        if (!modifiable)
            throw new UnsupportedOperationException("unmodifiable");
        return list.add(e);
    }

    @Override
    public String toString() {
        return list.toString();
    }
}

MyList<String> list = new MyList<>();
list.add("Aha 1");
list.add("Aha 2");
list.setModifiable(false);
list.add("Aha 3");  // UnsupportedOperationException!

您需要创建原始列表的副本:unmodifiableList 只是对原始列表的包装。

您可以使用 ArrayList List<String> unmodifiable = Collections.unmodifiableList(new ArrayList<>(strings)),或番石榴 List<String> unmodifiable = ImmutableList.copyOf(strings)