Lista inmutable en Java

  • ImmutableList, como sugiere el nombre, es un tipo de Lista que es inmutable. Significa que el contenido de la Lista es fijo o constante después de la declaración, es decir, son de solo lectura .
  • Si se intenta agregar, eliminar y actualizar elementos en la lista, se lanza la excepción UnsupportedOperationException .
  • Una ImmutableList tampoco permite elementos nulos.
  • Si se intenta crear una ImmutableList con un elemento nulo, se lanza una NullPointerException . Si se intenta agregar un elemento nulo en la lista, se lanza la excepción UnsupportedOperationException .

Ventajas de ImmutableList

  • Son seguros para subprocesos.
  • Son eficientes en memoria.
  • Dado que son inmutables, pueden transferirse a bibliotecas de terceros sin ningún problema.

Tenga en cuenta que es una colección inmutable, no una colección de objetos inmutables, por lo que los objetos que contiene pueden modificarse.

Declaración de clase:

@GwtCompatible(serializable=true,
               emulated=true)
public abstract class ImmutableList
extends ImmutableCollection
implements List, RandomAccess

Jerarquía de clases:

java.lang.Object
  ↳ java.util.AbstractCollection
      ↳ com.google.common.collect.ImmutableCollection
          ↳ com.google.common.collect.ImmutableList 

Creación de ImmutableList
ImmutableList se puede crear mediante varios métodos. Éstos incluyen:

  1. De la lista existente usando la función copyOf() de Guayaba

    // Below is the Java program to create ImmutableList
      
    import com.google.common.collect.ImmutableList;
    import java.util.*;
      
    class GFG {
      
        // Function to create ImmutableList from List
        public static <T> void iList(List<T> list)
        {
            // Create ImmutableMap from Map using copyOf()
            ImmutableList<T> immutableList =
                              ImmutableList.copyOf(list);
      
            // Print the ImmutableMap
            System.out.println(immutableList);
        }
      
        public static void main(String[] args)
        {
            List<String> list = new ArrayList<>(
                Arrays.asList("Geeks", "For", "Geeks"));
      
            iList(list);
        }
    }

    Producción:

    [Geeks, For, Geeks]
    
  2. Nueva ImmutableList usando la función of() de Guava

    // Below is the Java program to create ImmutableList
      
    import com.google.common.collect.ImmutableList;
    import java.util.*;
      
    class GFG {
      
        // Function to create ImmutableList
        public static void iList()
        {
            // Create ImmutableList using of()
            ImmutableList<String> immutableList = 
                   ImmutableList.of("Geeks", "For", "Geeks");
      
            // Print the ImmutableMap
            System.out.println(immutableList);
        }
      
        public static void main(String[] args)
        {
            iList();
        }
    }

    Producción:

    [Geeks, For, Geeks]
    
  3. Usando el método Java 9 Factory Of()

    En Java, use of() con Set, Map o List para crear una lista inmutable.

    Tenga en cuenta: los programas a continuación son de Java 9. Por lo tanto, necesitaría un compilador de Java 9 para ejecutarlos.

    // Java code illustrating of() method to
    // create a ImmutableSet
    import java.util.*;
    import com.google.common.collect.ImmutableList;
      
    class GfG {
        public static void main(String args[])
        {
            // non-empty immutable set
            List<String> list = List.of("Geeks", "For", "Geeks");
      
            // Let's print the list
            System.out.println(list);
        }
    }

    Producción:

    [Geeks, For, Geeks]
    
  4. Usando Builder() de ImmutableList

    En Guava, la clase ImmnutableList proporciona una función Builder(). A través de esta función, se puede crear una nueva ImmutableList, o se puede crear
    una ImmutableList a partir de una Lista existente o ambas.

    • Creando una nueva ImmutableList

      // Java code illustrating of() method to
      // create a ImmutableList
      import java.util.*;
      import com.google.common.collect.ImmutableList;
        
      class GfG {
          public static void main(String args[])
          {
              // non-empty immutable set
              ImmutableList<String> iList = ImmutableList.<String>builder()
                                                .add("Geeks", "For", "Geeks")
                                                .build();
        
              // Let's print the List
              System.out.println(iList);
          }
      }

      Producción:

      [Geeks, For, Geeks]
      
    • Creación de una lista inmutable a partir de una lista existente

      // Java code illustrating of() method to
      // create a ImmutableList
      import java.util.*;
      import com.google.common.collect.ImmutableList;
        
      class GfG {
          public static void main(String args[])
          {
              // non-empty immutable set
              List<String> list = List.of("Geeks", "For", "Geeks");
              ImmutableList<String> iList = ImmutableList.<String>builder()
                                                .addAll(list)
                                                .build();
        
              // Let's print the List
              System.out.println(iList);
          }
      }

      Producción:

      [Geeks, For, Geeks]
      
    • Crear una nueva ImmutableList que incluya la Lista existente

      // Java code illustrating of() method to
      // create a ImmutableList
      import java.util.*;
      import com.google.common.collect.ImmutableList;
        
      class GfG {
          public static void main(String args[])
          {
              // non-empty immutable set
              List<String> list = List.of("Geeks", "For", "Geeks");
              ImmutableList<String> iList = ImmutableList.<String>builder()
                                                .addAll(list)
                                                .add("Computer", "Portal", )
                                                .build();
        
              // Let's print the set
              System.out.println(iList);
          }
      }

      Producción:

      [Geeks, For, Geeks, Computer, Portal]
      

Intenta cambiar ImmutableList

Como se mencionó anteriormente, el siguiente programa lanzará UnsupportedOperationException .

// Java code to show that UnsupportedOperationException
// will be thrown when ImmutableList is modified.
import java.util.*;
  
class GfG {
    public static void main(String args[])
    {
        // empty immutable map
        List<String> list = List.of();
  
        // Lets try adding element in  List
        List.add("Geeks");
    }
}

Producción :

Exception in thread "main" java.lang.UnsupportedOperationException
    at com.google.common.collect.ImmutableCollection.add(ImmutableCollection.java:218)
    at ImmutableListDemo.main(Main.java:16)

¿En qué se diferencia de Collections.unmodifiableList()?

Collections.unmodifiableList crea un contenedor alrededor de la misma lista existente de modo que el contenedor no se puede usar para modificarlo. Sin embargo, todavía podemos cambiar la lista original.

// Java program to demonstrate that a List created using
// Collections.unmodifiableList() can be modified indirectly.
import java.io.*;
import java.util.*;
  
class GFG {
    public static void main(String[] args)
    {
        List<String> list = new ArrayList<>();
        list.add("Geeks");
  
        // Create ImmutableList from List using copyOf()
        List<String> iList = Collections.unmodifiableList(list);
  
        // We change List and the changes reflect in iList.
        list.add("For");
        list.add("Geeks");
  
        System.out.println(iList);
    }
}

Producción:

[Geeks, For, Geeks]

Si creamos una ImmutableList a partir de una Lista existente y cambiamos la Lista existente, la ImmutableList no cambia porque se crea una copia.

// Below is a Java program for
// Creating an immutable List using copyOf()
// and modifying original List.
import java.io.*;
import java.util.*;
import com.google.common.collect.ImmutableList;
  
class GFG {
    public static void main(String[] args)
    {
        List<String> list = new ArrayList<>();
        list.add("Geeks");
  
        // Create ImmutableList from List using copyOf()
        ImmutableList<String> iList = ImmutableList.copyOf(list);
  
        // We change List and the changes wont reflect in iList.
        list.add("For");
        list.add("Geeks");
  
        System.out.println(iList);
    }
}

Producción :

[Geeks]

Publicación traducida automáticamente

Artículo escrito por RishabhPrabhu y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *