首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java不变集合,还修正了引用

Java不变集合,还修正了引用
EN

Stack Overflow用户
提问于 2016-03-17 07:07:13
回答 2查看 129关注 0票数 1

我很难创建未经修改的ImmutableList,但只会限制生成的集合,尽管可以修改创建它的集合。

代码语言:javascript
复制
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);
            }
        }

    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-17 07:44:52

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

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

票数 1
EN

Stack Overflow用户

发布于 2016-03-17 07:34:39

尝尝这个。

代码语言:javascript
复制
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();
    }
}

代码语言:javascript
复制
MyList<String> list = new MyList<>();
list.add("Aha 1");
list.add("Aha 2");
list.setModifiable(false);
list.add("Aha 3");  // UnsupportedOperationException!
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36053705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档