2016-03-26 1 views
1

Si je fais quelque chose commeExiste-t-il un moyen de rendre un tableau vraiment privé en Java?

private int[] myPrivateArray; 

et un getter qui retourne le tableau, alors le contenu du tableau peuvent être modifiés à partir de l'extérieur de la classe, qui défaites en quelque sorte le but de le rendre privé.

+1

si vous ne voulez pas modifier le contenu de la copie de retour à l'extérieur de votre objet tableau privé. utiliser le clonage profond ou le clonage superficiel en conséquence. – Vishrant

+3

"Si je ... ai un getter qui renvoie le tableau" - * pourquoi avez-vous cela *? Vous n'avez pas besoin d'un getter pour tout. – user2357112

+1

Copies défensives? De la même manière que tout état modifiable - si vous ne voulez pas l'exposer, vous devez retourner des copies ou des objets immuables. –

Répondre

3

Vous pouvez fournir des setters, getters pour les éléments d'index spécifiques du tableau, un peu comme le font les implémentations de List. En ce qui concerne le retour d'une fonction, vous pouvez copier le tableau, et passer la copie à la place. Plutôt que de passer une référence à votre tableau, vous passez une référence à une copie de votre tableau.

4

Oui, il y a.

Premièrement, ne fournissez pas de getter pour ce tableau si vous n'en avez pas besoin. Si vous devez fournir un getter, passez une copie, pas la variable privée. Ensuite, assurez-vous que la JVM SecurityManager est configurée pour arrêter reflection.

2

Comme d'autres l'ont dit, vous pouvez retourner une copie du tableau:

public int[]getMyArray(){ 
    return myPrivateArray.clone(); 
} 

Vous pouvez fournir un getter pour accéder aux éléments individuels du tableau:

public int getMyArray(int index){ 
    return myPrivateArray.get(index); 
} 

Enfin, si vous souhaitez éviter la copie, mais insistez pour renvoyer tous les éléments à la fois, vous pouvez renvoyer une vue de liste non modifiable de votre matrice:

public class MyClass{ 
    private Object[]myPrivateArray; 

    private List<Object>myArrayView=Collections.unmodifiableList(Arrays.asList(myPrivateArray)); 

    public List<Object>getMyArrayView(){ 
     return myArrayView; 
    } 
} 

Bien que ce soit un peu plus compliqué avec un tableau de primitives:

public class MyClass{ 
    private int[]myPrivateArray; 

    private List<Integer>myArrayView=new AbstractList<Integer>(){ 
     @Override public int size(){ 
      return myPrivateArray.length; 
     } 
     @Override public Integer get(int index){ 
      return myPrivateArray[index] 
     } 
    } 
    public List<Integer>getMyArrayView(){ 
     return myArrayView; 
    } 
}