2010-04-06 5 views
2

J'ai une structure de données comme un Rowset de base de données, dont les lignes et les lignes ont des colonnes. J'ai besoin d'initialiser une colonne avec des valeurs nulles, le code actuel est de faire une boucle à travers chaque colonne pour une ligne et d'initialiser les valeurs à NULL. Ce qui est très inefficace si vous avez 100s ou des lignes et 10s de colonne. Donc à la place je garde une ArrayList initialisée de colonnes au niveau de RowSet, puis je fais un clone de cette Arraylist pour les lignes individuelles, car je crois que clone() est plus rapide que de boucler chaque élément.Clonage de Java ArrayList et prévention des modifications

row.columnsValues ​​= rowsset.NullArrayList.clone()

problème est NullArrayList peut être modifié accidentellement après avoir été cloné, sacrifiant ainsi l'intégrité de ArrayList au niveau RowSet, pour éviter que je fais 3 choses

1) Delcaring ArrayList en tant que final 2) Tous les éléments que j'insère sont finaux ou nuls 3) Les méthodes pour lesquelles arrayList est passée à d'autres baies sont déclarées définitives.

Cela ressemble à un plan, voyez-vous des trous?

Répondre

7

Vous pouvez utiliser Collections.unmodifiableList((List) originalList.clone())

Renvoie une vue non modifiable de la liste spécifiée. Cette méthode permet aux modules de fournir aux utilisateurs un accès «en lecture seule» aux listes internes.

+1

Ce n'est pas correct. Vous pouvez toujours ajouter quelque chose à la liste non modifiable en ajoutant quelque chose à la liste originale. – Fortega

+0

a ajouté un appel à 'clone()' – Bozho

+0

C'est mieux :) – Fortega

5

Vous pourrez toujours ajouter de nouveaux éléments à la baie.

Pourquoi ne pas utiliser:

row.columnsValues = Collections.unmodifiableList((ArrayList) rowsset.NullArrayList.clone())

+1

la méthode clone() renvoie un objet, alors rowsset.NullArrayList.clone() doit être casté en un ArrayList – Fortega

+0

@Fortega thnx, corrigé maintenant. – pajton

+0

myList = Collection.unmodifiableList (rowsset.NullArrayList.clone()) J'ai besoin de la possibilité de modifier les éléments myList comme suit: myList.set (i, new Object()); Cependant, je veux empêcher, myList.get (i) .setXYZ(), quand l'objet de retour est l'un des originaux à la suite de clone(). Je pense que la manière de le résoudre sera quand je crée l'original NullArrayList j'ai besoin de stocker des objets qui sont définis comme "final" final Objet obj = new Object(); NullArrayList.add (i, obj); – tech20nn

0

Voici la classe dont instance garde ArrayList commune, cette liste est partagée, mais ne peut pas être changé en dehors de cette classe. Les éléments de cette liste doivent également se protéger car une copie superficielle est renvoyée.

public class ArrayListUnmodifiability { 


private ArrayList myList; 
public ArrayListUnmodifiability() { 

    myList = new ArrayList(2);  
    MyObj obj = new MyObj("Cannot be changed"); 
    obj.setValue(1); 
    myList.add(0, obj); 
    myList.add(1, null);   
} 


public ArrayList getList() { 
    return (ArrayList) myList.clone(); 
} 


} 

public class MyObj { 

public MyObj(String name) { 
    this.name = name; 
} 

public String getName() { 
    return name; 
} 

private final String name; 

}