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)
我正在努力创建 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)