J’ai une librairie Java que je considère porter sur C #. La bibliothèque Java utilise largement les annotations (au moment de la construction et de l’exécution).
Je n’ai jamais utilisé d’atsortingbuts C #, mais je comprends qu’ils constituent l’équivalent approximatif des annotations Java.
Si je continue avec le port en utilisant des atsortingbuts pour remplacer les annotations, que dois-je savoir? Qu’est-ce qui va être le même? Différent? Qu’est-ce qui va me mordre?
Le contrôle de la disponibilité des métadonnées est différent entre les deux langues.
Java fournit l’annotation java.lang.annotation.Retention et java.lang.annotation.RetentionPolicy enum pour contrôler la disponibilité des métadonnées d’annotation. Les choix varient de Runtime
(la plupart des métadonnées d’annotation retenues dans les fichiers de classe) à Source
(métadonnées ignorées par le compilateur). Vous marquez votre interface d’annotation personnalisée avec ceci – par exemple:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.CLASS) public @interface TraceLogging { // etc }
TraceLogging
vous permettrait de réfléchir à votre annotation TraceLogging
personnalisée à l’exécution.
C # utilise l’atsortingbut ConditionalAtsortingbute qui est piloté à partir des symboles de compilation. Ainsi, l’exemple analogue en C # est:
[Conditional("TRACE")] public class TraceLoggingAtsortingbute : Atsortingbute { // etc }
ce qui obligerait le compilateur à cracher les métadonnées de votre atsortingbut TraceLogging
personnalisé uniquement si le symbole TRACE
était défini.
NB Les métadonnées d’atsortingbut sont disponibles à l’exécution par défaut en C # – elles ne sont nécessaires que si vous souhaitez les modifier.
Un aspect important des annotations Java que je n’ai pas encore examiné en détail: vous pouvez écrire du code qui utilise des annotations dans javac (à partir de Java 6, je crois) comme forme de métaprogrammation .
PostSharp permet certes quelque chose de similaire.
(C’est loin d’être la seule différence, mais c’est tout ce que j’ai du temps pour le moment.)
Une différence intéressante est que C # autorise les atsortingbuts de module et d’assemblage. Celles-ci sont appliquées à votre module ou à votre ensemble et sont disponibles par reflection de manière normale. Java ne fournit pas de reflection sur un fichier jar, les annotations au niveau jar ne sont donc pas possibles.
En fait, cela est assez courant en tant que fichier Visual Studio appelé AssemblyInfo.cs
au niveau du projet racine qui contient par exemple:
[assembly: AssemblyVersionAtsortingbute("1.2.3.4")] [assembly: AssemblyTitleAtsortingbute("My project name blah blah")] ...
Il n’y a pas d’annotation de niveau jar équivalente en Java (bien que depuis jdk5, il existe un mécanisme d’annotation au niveau du package peu utilisé – grâce à mmeyers qui l’a signalé)
Suite à ce que Jon a dit …
Java 5 et Java 6 permettent tous deux la métaprogrammation. Java 5 utilise un outil apt distinct; Java 6 l’intègre dans le compilateur. (Bien que Java 5 apt soit toujours disponible dans Java 6)
Malheureusement, chacun utilise une API différente.
J’utilise actuellement l’API Java 5 pour mes annotations Bean
Voir http://code.google.com/p/javadude/wiki/Annotations pour un exemple (REMARQUE: je fais actuellement des mises à jour majeures, dont certaines changent l’API.)
Des trucs très cool … – Scott