50 votes

Quelles sont les similitudes et les différences entre les annotations Java et les attributs C#?

Je dispose d'une bibliothèque Java que je envisage de porter en C#. La bibliothèque Java utilise beaucoup les annotations (à la fois au moment de la construction et au moment de l'exécution).

Je n'ai jamais utilisé les attributs C#, mais je comprends qu'ils sont l'équivalent approximatif des annotations Java.

Si je décide de poursuivre le port en utilisant des attributs pour remplacer les annotations, que dois-je savoir ? Qu'est-ce qui sera similaire ? Différent ? Qu'est-ce qui pourrait poser problème ?

30voto

serg10 Points 10157

Le contrôle sur le moment où vos métadonnées sont rendues accessibles est différent entre les deux langues.

Java fournit l'annotation java.lang.annotation.Retention et l'énumération java.lang.annotation.RetentionPolicy pour contrôler quand les métadonnées d'annotation sont accessibles. Les choix varient de Runtime (le plus courant - les métadonnées d'annotation sont conservées dans les fichiers de classe) à Source (métadonnées jetées par le compilateur). Vous étiquetez votre interface d'annotation personnalisée avec ceci - par exemple :

**

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.CLASS)
public @interface TraceLogging {
  // etc
}

vous permettrait de réfléchir sur votre annotation personnalisée TraceLogging à l'exécution.

C# utilise l'attribut ConditionalAttribute qui est basé sur des symboles de temps de compilation. Donc l'exemple analogue en C# est :

[Conditional("TRACE")]
public class TraceLoggingAttribute : Attribute
{
  // etc
}

qui amènerait le compilateur à générer les métadonnées pour votre attribut personnalisé TraceLogging uniquement si le symbole TRACE était défini.

NB. les métadonnées d'attribut sont disponibles par défaut à l'exécution en C# - cela n'est nécessaire que si vous voulez changer cela.

**

4 votes

+1 : La rétention en temps d'exécution sera importante pour le port. Merci.

1 votes

Yw. Notez que selon ma dernière modification, vous pourrez réfléchir à votre attribut C# personnalisé si vous ne faites rien. Ce mécanisme vous permet de désactiver ce comportement par défaut, qui est probablement d'une utilité limitée pour être honnête.

18voto

Jon Skeet Points 692016

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 une forme de méta-programmation.

PostSharp permet quelque chose de similaire, il faut l'admettre.

(Ce n'est pas la seule différence, mais c'est tout ce que j'ai le temps de mentionner pour l'instant.)

0 votes

Tant que j'ai envisagé apt, je n'utilise pas réellement l'API APT - mon code utilise la réflexion (et un doclet) pour faire son travail (au lieu d'utiliser APT pour générer un ensemble de choses intermédiaires pendant la compilation.) Donc, je pense que je ne suis pas inquiet de cette capacité manquante. Continuez comme ça :)

0 votes

Jon - je te contacte juste pour te dire qu'il y a une prime de 100 points sur cette question - si tu as plus de temps pour donner une réponse plus complète (et que les points en valent la peine) - je serais certainement reconnaissant :). Merci !

0 votes

Hmm... Je verrai si je peux trouver le temps d'examiner cela plus en détail. Je pourrais bien ne pas avoir le temps cependant :(

15voto

serg10 Points 10157

Une différence intéressante est que C# permet les attributs au niveau du module et de l'assembly. Ceux-ci sont appliqués à votre module ou assembly et sont disponibles via la réflexion de manière normale. Java ne permet pas la réflexion sur un fichier jar, donc les annotations au niveau du jar ne sont pas possibles.

En fait, c'est assez courant car Visual Studio contient un fichier appelé AssemblyInfo.cs au niveau du projet racine qui contient, par exemple:

[assembly: AssemblyVersionAttribute("1.2.3.4")]
[assembly: AssemblyTitleAttribute("Le nom de mon projet blah blah")]
...

Il n'y a pas d'équivalent d'annotation au niveau du jar en Java (bien que depuis jdk5, il existe un mécanisme d'annotation au niveau du package peu utilisé - merci à mmeyers d'avoir signalé cela)

3 votes

Il existe en fait des annotations au niveau du package en Java : voir java.sun.com/docs/books/jls/third_edition/html/….

0 votes

Il ne s'applique pas à tous les types publics ! Ils s'appliquent uniquement à l'assembly ou au module.

3voto

Scott Stanchfield Points 15863

En réponse à ce que Jon a dit...

Java 5 et Java 6 permettent tous deux la méta-programmation. Java 5 utilise un outil apt séparé; Java 6 l'intègre dans le compilateur. (Bien que l'apt de Java 5 soit toujours disponible dans Java 6)

Malheureusement, chacun utilise une API différente.

Je suis actuellement en train d'utiliser l'API Java 5 pour mes annotations Bean

Voir http://code.google.com/p/javadude/wiki/Annotations pour un exemple (REMARQUE : Je suis actuellement en train de faire des mises à jour majeures, dont certaines modifient l'API.)

Des trucs vraiment cool... -- Scott

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X