Implementé una clase en Java que, internamente, almacena una lista . Quiero que la clase sea inmutable. Sin embargo, necesito realizar operaciones en los datos internos que no tienen sentido en el contexto de la clase. Por lo tanto, tengo otra clase que define un conjunto de algoritmos. Aquí está un ejemplo simplificado:Objetos inmutables en Java y acceso a datos
Wrapper.java
import java.util.List;
import java.util.Iterator;
public class Wrapper implements Iterable<Double>
{
private final List<Double> list;
public Wrapper(List<Double> list)
{
this.list = list;
}
public Iterator<Double> iterator()
{
return getList().iterator();
}
public List<Double> data() { return getList(); }
}
Algorithm.java
import java.util.Iterator;
import java.util.Collection;
public class Algorithm
{
public static double sum(Collection<Double> collection)
{
double sum = 0.0;
Iterator<Double> iterator = collection.iterator();
// Throws NoSuchElementException if the Collection contains no elements
do
{
sum += iterator.next();
}
while(iterator.hasNext());
return sum;
}
}
Ahora, mi pregunta es, ¿hay una forma segura de evitar que alguien modificando mis datos internos a pesar de que mi clase debe ser inmutable? Si bien proporcioné un método () con fines de solo lectura, no hay nada que impida que alguien modifique los datos mediante métodos como borrar() y quitar(). Ahora, me doy cuenta de que podría proporcionar acceso a mis datos exclusivamente a través de iteradores. Sin embargo, me han dicho que es típico pasar una Colección . En segundo lugar, si tuviera un algoritmo que requiriera más de una pasada sobre los datos, tendría que proporcionar múltiples iteradores, lo que parece una pendiente resbaladiza.
De acuerdo, con suerte hay una solución simple que resolverá mis preocupaciones. Acabo de volver a Java y nunca consideré estas cosas antes de tratar con const en C++. ¡Gracias por adelantado!
¡Oh! Hay una cosa más en la que solo pensé. Prácticamente no puedo devolver una copia de la lista interna. La lista generalmente contiene cientos de miles de elementos.
¡Perfecto! No vi esto. Gracias. –
Aún tiene que ocuparse de la forma en que se crea el objeto Wrapper: dado que la Lista se pasa al constructor, puede haber referencias a ella en otro lugar del código. Si desea que Wrapper sea realmente inmutable, tendrá que copiar el contenido de la lista. –