List.copyOf
List lista não modificável
Você perguntou:
Não há outra maneira de atribuir uma cópia de uma lista
O Java 9 trouxe os List.of
métodos para o uso de literais para criar uma List
classe concreta não modificável e desconhecida.
LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
List< LocalDate > dates = List.of(
today.minusDays( 1 ) , // Yesterday
today , // Today
today.plusDays( 1 ) // Tomorrow
);
Junto com isso, também conseguimos List.copyOf
. Esse método também retorna uma List
classe concreta não modificável e desconhecida.
List< String > colors = new ArrayList<>( 4 ) ; // Creates a modifiable `List`.
colors.add ( "AliceBlue" ) ;
colors.add ( "PapayaWhip" ) ;
colors.add ( "Chartreuse" ) ;
colors.add ( "DarkSlateGray" ) ;
List< String > masterColors = List.copyOf( colors ) ; // Creates an unmodifiable `List`.
Por "não modificável", queremos dizer que o número de elementos na lista e o referente referente ao objeto mantido em cada slot como um elemento são fixos. Você não pode adicionar, soltar ou substituir elementos. Mas o objeto referente mantido em cada elemento pode ou não ser mutável .
colors.remove( 2 ) ; // SUCCEEDS.
masterColors.remove( 2 ) ; // FAIL - ERROR.
Veja este código executado ao vivo em IdeOne.com .
datas.toString (): [2020-02-02, 2020-02-03, 2020-02-04]
colors.toString (): [AliceBlue, PapayaWhip, DarkSlateGray]
masterColors.toString (): [AliceBlue, PapayaWhip, Chartreuse, DarkSlateGray]
Você perguntou sobre referências a objetos. Como outros disseram, se você criar uma lista e atribuí-la a duas variáveis de referência (ponteiros), ainda terá apenas uma lista. Ambos apontam para a mesma lista. Se você usar um ponteiro para modificar a lista, os dois ponteiros verão as alterações posteriormente, pois há apenas uma lista na memória.
Então você precisa fazer uma cópia da lista. Se você deseja que a cópia não seja modificável, use o List.copyOf
método conforme discutido nesta resposta. Nesta abordagem, você acaba com duas listas separadas, cada uma com elementos que mantêm uma referência aos mesmos objetos de conteúdo. Por exemplo, em nosso exemplo acima, usando String
objetos para representar cores, os objetos de cores estão flutuando na memória em algum lugar. As duas listas contêm ponteiros para os mesmos objetos de cor. Aqui está um diagrama.
A primeira lista colors
é modificável. Isso significa que alguns elementos podem ser removidos como visto no código acima, onde removemos o terceiro elemento original Chartreuse
(índice de 2 = ordinal 3). E elementos podem ser adicionados. E os elementos podem ser alterados para apontar para outros String
, como OliveDrab
ou CornflowerBlue
.
Por outro lado, os quatro elementos de masterColors
são fixos. Sem remoção, sem adição e sem substituição de outra cor. Essa List
implementação não é modificável.