2010-11-12 59 views
1

Regardez le code suivant que je copie à partir de javax.naming.InitialContext. Un argument de type HashTable est en cours de transmission au constructeur. ici est l'extrait de codeJava Code - Pourquoi une variable est clonée ici?

public InitialContext(Hashtable<?,?> environment) throws NamingException 
{ 
    if (environment != null) { 
     environment = (Hashtable)environment.clone(); 
    } 
    init(environment); 
} 

Ma question est, pourquoi l'environnement est cloné ici quand il aurait pu être passé directement à la méthode d'initialisation?

Répondre

6

Ce code se protège d'un appelant externe en changeant l'état du HashTable. En créant clone, ils s'assurent que les modifications apportées au Hashtable qui ont été transmises ne sont pas répercutées dans la méthode/l'objet dans lequel la table a été transmise.

un court exemple en utilisant des tableaux:

//Outside code 
int[] arr = new int[]{0, 1, 2, 3}; 

// method of class 
public void init(int[] arr) { 
    this.arr = arr; 
} 

//meanwhile, in the external code 
arr[0] = 42; // this change to the array will be reflected inside the object. 

Cette vulnérabilité peut être évité en faisant une copie du tableau. Les modifications apportées au tableau d'origine n'apparaîtront pas dans la copie.

+2

Je pense que je reformulerais ta première phrase à "Ce code protège * lui-même * d'un appelant externe en changeant l'état du HashTable". Bien que ce soit une protection très limitée, étant donné que H'ashtable.clone() 'est un clone peu profond: l'appelant peut toujours changer les valeurs mutables (je ne me souviens pas si les valeurs de contexte sont limitées aux chaînes ou non). – Anon

+0

@Anon, bon conseil. Terminé. – jjnguy

+0

@Anon, les chances sont bonnes que la seule chose qui les inquiète sont les ajouts ou les suppressions. Ils utilisent probablement des objets immuables comme clés ou valeurs. – jjnguy

2

Parce qu'il pourrait être changé de l'extérieur de cette méthode?