Trong ổi, có cách hiệu quả để thêm hoặc xóa các mục vào một số ImmutableList
(tạo Danh sách mới trong tiến trình).Thêm và xóa các mục vào một danh sách không cần thiết của Guava ImmutableList
Cách đơn giản nhất tôi có thể đưa ra là thế này:
private ImmutableList<String> foos = ImmutableList.of();
public void addFoo(final String foo) {
if (this.foos.isEmpty()) {
foos = ImmutableList.of(foo);
} else {
foos = ImmutableList.<String>builder().addAll(foos).add(foo).build();
}
}
public void removeFoo(final String foo) {
final int index = this.foos.indexOf(foo);
if (index > -1) {
final Builder<String> builder = ImmutableList.<String>builder();
if (index > 0) builder.addAll(this.foos.subList(0, index));
final int size = this.foos.size();
if (index < size - 1) builder.addAll(this.foos.subList(index+1, size));
this.foos = builder.build();
}
}
Những gì tôi muốn tránh làm là thế này:
public void removeFoo(final String foo) {
final ArrayList<String> tmpList = Lists.newArrayList(this.foos);
if(tmpList.remove(foo))this.foos=ImmutableList.copyOf(tmpList);
}
Nhưng tiếc là nó là như vậy đơn giản hơn nhiều so với bất kỳ Guava- chỉ có phương pháp tôi có thể nghĩ đến. Tôi đã bỏ lỡ một cái gì đó?
Bạn đang cố giải quyết vấn đề cấp cao hơn nào? Có lẽ bạn không nên đối phó với danh sách bất biến nếu bạn cần thay đổi chúng. – sjr
Tại sao bạn muốn tránh nó? –
Tôi biết tôi có thể giải quyết vấn đề một cách dễ dàng khi sử dụng Danh sách có thể thay đổi được như dữ liệu giữa các chủ sở hữu dữ liệu nhưng a) Tôi phải tạo các bộ sưu tập trung gian thừa và b) Tôi phải trộn bộ sưu tập java.util với guava ImmutableCollections, trong khi tôi muốn gắn với một mô hình. Và tôi muốn sử dụng một ImmutableList vì tôi muốn trao nó cho các máy khách trong phương thức 'getFoos()' mà không mất quyền kiểm soát hoặc phải tạo ra nhiều đối tượng bao bọc Collections.unmodifiableList. –