How to create Immutable List in java?

后端 未结 7 1763
隐瞒了意图╮
隐瞒了意图╮ 2020-12-29 01:16

I need to convert mutable list object to immutable list. What is the possible way in java?

public void action() {
    List mutableList =          


        
相关标签:
7条回答
  • 2020-12-29 01:53

    From Java 10 on, List.copyOf(Collection) can be used to return an unmodifiable list from the given collection. From source code of List.copyOf method:

    • if the given collection is an unmodifiable List, List.copyOf() will not create a copy.

    • if the given collection is mutable and modified, the returned list will not reflect such modifications. Meaning they are independent.

    0 讨论(0)
  • 2020-12-29 02:00

    Use Collections.unmodifiableList(). You pass in your original ArrayList and it returns a list that throws an exception if you try to add, remove or shift elements. For example, use return Collections.unmodifiableList(beanList); instead of return beanList; at the end of getImmutableList(). main() will throw an exception. The Collections class has methods for all of the other common collection types besides List as well.

    0 讨论(0)
  • 2020-12-29 02:04

    Once your beanList has been initialized, you can do

    beanList = Collections.unmodifiableList(beanList);
    

    to make it unmodifiable. (See Immutable vs Unmodifiable collection)

    If you have both internal methods that should be able to modify the list, and public methods that should not allow modification, I'd suggest you do

    // public facing method where clients should not be able to modify list    
    public List<Bean> getImmutableList(int size) {
        return Collections.unmodifiableList(getMutableList(size));
    }
    
    // private internal method (to be used from main in your case)
    private List<Bean> getMutableList(int size) {
        List<Bean> beanList = new ArrayList<Bean>();
        int i = 0;
    
        while(i < size) {
            Bean bean = new Bean("name" + i, "address" + i, i + 18);
            beanList.add(bean);
            i++;
        }
        return beanList;
    }
    

    (Your Bean objects already seem immutable.)


    As a side-note: If you happen to be using Java 8+, your getMutableList can be expressed as follows:

    return IntStream.range(0,  size)
                    .mapToObj(i -> new Bean("name" + i, "address" + i, i + 18))
                    .collect(Collectors.toCollection(ArrayList::new));
    
    0 讨论(0)
  • 2020-12-29 02:04

    In JDK 8:

    List<String> stringList = Arrays.asList("a", "b", "c");
    stringList = Collections.unmodifiableList(stringList);
    

    In JDK 9:

    List stringList = List.of("a", "b", "c");
    

    reference

    0 讨论(0)
  • 2020-12-29 02:09

    If are open to using a third party library, Eclipse Collections lets you convert from MutableList to ImmutableList and back again.

    MutableList<String> mutable = Lists.mutable.with("a", "b", "c");
    ImmutableList<String> immutable = mutable.toImmutable();
    MutableList<String> mutableAgain = immutable.toList();
    

    This also works with primitive collections.

    MutableCharList mutable = CharLists.mutable.with('a', 'b', 'c');
    ImmutableCharList immutable = mutable.toImmutable();
    MutableCharList mutableAgain = immutable.toList();
    

    If you have an ArrayList as the mutable List, the following will work.

    List<String> mutable = new ArrayList<>(Arrays.asList("a", "b", "c"));
    ImmutableList<String> immutable = Lists.immutable.withAll(mutable);
    List<String> mutableAgain = immutable.toList();
    

    Note: I am a committer for Eclipse Collections.

    0 讨论(0)
  • 2020-12-29 02:10

    Make it immutable instead of using directly unmodifiableList on list as otherwise still original list can be changed.

    Basically unModifiable Collection is a view, So indirectly it could still be 'modified' from some other reference that is modifiable. Also as its just a readonly view of annother collection , When the source collection changes unModifiable Collection will always present with latest values.

    However immutable Collection can be treated as a readonly copy of another collection and can not be modified. In this case when the source collection changes , immutable Collection do not reflect the changes

    List<String> immutableList=Collections.unmodifiableList(
                                new ArrayList<String>(modifiableList));
    

    Using guava:

    import java.util.*; 
    import com.google.common.collect.ImmutableList; 
    ImmutableList<String> iList = ImmutableList.copyOf(list); 
    
    0 讨论(0)
提交回复
热议问题