5 votes

Interface de marquage ou méthode booléenne pour identifier les capacités de l'objet ?

Je suis en train de développer une vaste hiérarchie de classes Java, dont certaines ont une propriété particulière que je souhaite interroger au moment de l'exécution (la propriété ne s'applique qu'aux classes, pas aux instances spécifiques).

Je pourrais créer une méthode booléenne abstraite isFooBar() que les sous-classes peuvent mettre en œuvre pour indiquer si la propriété est présente ou non :

public abstract class MyBaseClass {
  ...
  public abstract boolean isFooBar();
}

Ou alors, je pourrais utiliser une interface de marquage. FooBarProperty et faire un instanceof de la vérification de l'interface :

public class MyConcreteClass extends MyBaseClass implements FooBarProperty {
   ...
}

Vous pouvez également utiliser une annotation, comme le suggère AmitD :

@FooBarAnnotation
public class MyConcreteClass extends MyBaseClass {
   ...
}

Quels sont les avantages et les inconvénients de chaque méthode, et laquelle devrait normalement être privilégiée ?

2voto

rbhawsar Points 580

Les interfaces de marqueurs n'ont pas de méthodes. Dans votre cas, votre interface dispose d'une méthode pour obtenir la propriété et c'est sur cette base que vous devez utiliser l'interface. Vous pouvez simplement utiliser cette interface pour contenir l'instance concrète des classes qui implémentent votre interface et peuvent appeler la méthode liée à la propriété.

Cependant, à l'autre extrémité, un marqueur est utilisé ou marqué pour une instance ou une hiérarchie afin qu'elle soit éligible à certaines fonctionnalités telles que la persistance.

2voto

Kojotak Points 1342

Les interfaces de marquage sont héritées dans la hiérarchie des classes, elles ont donc des capacités limitées (vous ne pouvez pas "supprimer" cette interface de marquage pour une sous-classe particulière) et je ne peux pas les recommander (Cloneable en est un mauvais exemple). La question est la suivante : votre propriété est-elle réellement liée à la classe de l'objet, et non à l'instance ? Si c'est le cas, les annotations sont préférables, car elles n'ajoutent pas de méthodes supplémentaires dans vos API et elles sont plus faciles à maintenir - il suffit d'ajouter/supprimer l'annotation (dans le cas d'une méthode de vérification, vous devez vérifier toutes les sous-classes, qu'elles la surchargent ou non).

EDIT : dans votre cas, je me poserais la question suivante : ma propriété est-elle du type "is persistent" (s'applique à toutes les instances d'une classe donnée) ou "is visible" (ne s'applique qu'à certaines instances) ?

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