2010-06-24 3 views
7

Je travaille sur une analyse pour les programmes Java qui nécessitent des informations d'effets secondaires sur les appels de méthodes. Pour les classes de bibliothèques standard, je voudrais compiler une liste de méthodes avec des paramètres en lecture seule. C'est-à-dire, des méthodes qui ne modifient pas leurs arguments, ou quelque chose accessible à partir de leurs arguments. Je peux en déduire beaucoup des javadocs, mais cela prendra du temps. Est-ce que quelqu'un pourrait suggérer une référence plus facile ou une méthode pour déterminer si les appels de méthode standard modifient leurs arguments? La lecture de chaque entrée de javadoc est-elle vraiment la meilleure?Méthodes libres d'effets secondaires dans la bibliothèque Java standard

Merci!

EDIT: Un bonus serait d'identifier les méthodes qui n'ont pas d'effets secondaires sur l'objet non plus. Par exemple, stack.pop() serait alors que stack.size() ne le ferait pas.

+1

Je serais intéressé à voir votre solution. Vous pouvez supposer que toutes les méthodes qui prennent des types immuables sont sans effets secondaires. Vous ne savez pas quoi d'autre vous pouvez faire en dehors de javadocs et du code. –

+0

@SB: Gardez juste à l'esprit que 'String' est immuable, mais que les classes implémentant' CharSequence' peuvent ou ne peuvent pas l'être. – Powerlord

Répondre

1

Eh bien, toutes les méthodes ne prenant que les types primitifs/chaînes/objets/types génériques comme paramètres devraient vous satisfaire sans autre considération. Et pour java.lang et java.util cela devrait couvrir la plupart des méthodes.

Mais vous feriez mieux de limiter les paquets que vous voulez traiter, car jdk standard offre une énorme bibliothèque de classes pour toutes les tâches et les buts.

modifier
Il est un peu plus floue pour les types génériques déclarés E extends ModifiableObject, donc voir par vous-même.

+0

C'est une bonne suggestion comme point de départ, merci. – Owen

1

Vous pouvez essayer d'exécuter un moteur d'inférence de type par rapport au code source du JDK. Le document Type qualifier inference for Java peut être utile. (Le texte intégral ne semble pas être en ligne si)

1

Notre DMS Software Reengineering Toolkit est un outil d'analyse et de transformation de programme personnalisable à usage général. Il a un Java Front End qui analyse Java et produit des tables de symboles, des relations d'héritage de classe, des informations de contrôle et de flux de données. À partir de cette information, des informations locales permettant de savoir si une méthode M modifie directement un argument ou quoi que ce soit accessible à partir d'un argument peuvent être calculées. Un graphe d'appel peut être construit, et tout ce qui est modifié par une méthode X appelée directement ou indirectement par M. C'est en fait votre réponse. Vous devrez appliquer ceci à la source du code d'intérêt, dans votre cas, la bibliothèque Java Standard.

Configurer DMS pour ce faire n'est pas trivial même avec toutes les informations fournies. OTOH, cette réponse va être assez précise (hypothèses et réflexions modulo conservatrices), répétable, et facile à appliquer à n'importe quelle méthode que vous choisissez. Faire cela à la main via Javadocs est susceptible d'être extrêmement long et sujet aux erreurs.

Questions connexes