Dois-je faire face à la situation où les méthodes privées sont appelées par la réflexion?

12

Lors de la création d'une bibliothèque, dois-je m'assurer que les méthodes privées doivent fonctionner comme prévu lorsqu'elles sont appelées non pas par d'autres méthodes de la même classe, mais par une autre bibliothèque par réflexion ?

Par exemple, si une méthode privée private DoSomething(int number)s'attend à ce que:

  • number est un entier positif non nul, et:
  • une variable privée string abcn'est pas nulle et pas une chaîne vide,

et complètement, laid échoue si ces deux conditions ne correspondent pas, dois - je gérer ces échecs , même si je sais que toutes les méthodes de la classe seront always¹ Assigner une valeur non-vide abcavant d' appeler DoSomething, et passer un entier non nul positif à cette méthode?

En d'autres termes, le code qui n'est pas protégé contre les appels dangereux par le biais de la réflexion peut-il être considéré comme un code de faible qualité , ou appartient-il à l'appelant qui utilise la réflexion pour s'assurer que l'appel ne casse rien?

Remarque: ma question ne couvre qu'un ensemble standard de bibliothèques. Cela ne couvre pas le code qui doit être hautement sécurisé (c'est-à-dire lorsque quelqu'un peut être intéressé par l'utilisation de la réflexion afin de la faire se comporter de manière inattendue ou se bloquer).


¹ Parce que la classe est correctement documentée, car il y a suffisamment de tests unitaires pour être sûr qu'aucun autre développeur ne cassera cette méthode, etc.

Arseni Mourzenko
la source
les classes dérivées pourront-elles appeler les méthodes privées?
oenone

Réponses:

16

En marquant votre méthode comme privée, vous avez établi vos intentions et un contrat. En utilisant la réflexion, un code client peut choisir de rompre avec ce contrat et devra donc en supporter les conséquences. La même chose se produit avec les protocoles, pour que les choses fonctionnent, les règles doivent être suivies ou de mauvaises choses se produiront.

Le même problème peut se produire avec d'autres langages tels que C ++ où j'ai vu des choses comme

#define private public

En résumé - vous n'êtes PAS obligé de faire face à ces situations, l'appelant devrait être mieux informé.

Otávio Décio
la source
3
J'ai vu des gens transtyper des classes en (caractère non signé *) et écrire directement dans l'offset mémoire d'une variable membre qu'ils souhaitent modifier. Mes yeux saignaient.
Shawn D.
6
J'ajouterais qu'il est essentiellement impossible de protéger votre classe contre un code privilégié dangereux . Si vous parvenez d'une manière ou d'une autre à vous protéger contre une utilisation inappropriée de la réflexion, quelqu'un trouvera un moyen différent de gâcher votre journée, peut-être simplement en écrasant directement la mémoire de votre processus. Le codage défensif atteint finalement un point de rendements décroissants, et la réflexion est bien au-delà de ce point.
Aaronaught
5

Si quelqu'un utilise la réflexion pour appeler vos méthodes privées, c'est un signe que quelqu'un fait quelque chose de mal. Soit il utilise le code d'une manière pour laquelle il n'a pas été conçu, soit vous cachez trop de fonctionnement interne et simplifiez l'API.

Mais il semble que vous n'en soyez pas encore à ce stade et que vous essayez simplement d'être préventif. Mon avis est donc: ne vous en faites pas. Une méthode privée devrait être considérée comme interdite; si quelqu'un viole délibérément ces limites, c'est son problème si les choses explosent.

Mike Baranczak
la source
0

Eh bien, c'est toujours une bonne idée de valider les variables non locales avant de les utiliser, mais à part ça, je ne m'en inquiéterais pas. Comme les autres l'ont dit, vous avez établi vos intentions en rendant la méthode privée en premier lieu; quiconque l'appelle de l'extérieur de votre classe n'a aucune garantie. Lorsque je travaille en Java, je ne mets même pas de commentaires javadoc sur mes méthodes privées, car je ne veux pas que les autres développeurs sachent même qu'ils sont là.

TMN
la source