Enums en Java 1.5 et le problème de Java 1.4

1 mai 2010 at 15 h 04 min Laisser un commentaire

En travaillant sur les mini jeux de horsepark.fr, développés sur la base du framework pulpcore, je me suis aperçu qu’il n’était pas possible d’utiliser les « enums », fonctionnalité apportée par java 1.5.
Cette limitation provient du fait que les applets Java doivent être compatibles avec Java 1.4, et que pulpcore supporte la syntaxe de Java 1.5 par le biais de retroguard… qui ne supporte pas actuellement cette syntaxe.

Dommage, car l’élégance apportée par ce nouveau type de classe est franchement appréciable.
Voici une petite comparaison des morceaux de code écrits avec les deux versions.

L’exemple est le suivant :
Imaginez une machine a état gérant les paramètres d’animation de votre jeu en fonction des entrées clavier correspondantes. A chaque état est associé un certain nombre de valeurs pour les paramètres, comme par exemple : sens du déplacement, vitesse d’animation du sprite, nom de l’état (course, marche, arret)…

Avec le type enum apporté par java 5, on déclare un type enum, contenant chacun des paramètres, déclarés dans le constructeur de l’enum, et avec un nombre fini d’instances:

public static int SpriteState {
ACTOR_BACK (1000, -1, "En arrière");
ACTOR_STOPPED (0, 0, "Au repos"),
ACTOR_WALK (1000, 1, "En route") ,
ACTOR_RUN (5000, 1, "Dépêchons nous!"),

private final int animSpeed;
private final int animDirection;
private final String animDescription;

SpriteState(int animSpeed, int animDirection, String animDescription) {
this.animSpeed = animSpeed;
this. animDirection = animDirection;
this. animDescription = animDescription;
}

public int speed() {
return this.animSpeed;
}
public int direction() {
return animDirection;
}
public int description() {
return animDescription;
}
}

Notre enumération d’état et nos paramètre sont regroupés et externalisés de la logique du contrôleur. Ainsi dans la boucle prinicipale, il suffit d’utiliser ce morceau de code pour changer d’état en réaction des entrées de l’utilisateur :

(code du contrôleur)

public void update(int elapsedTime) {
super.update(elapsedTime);
actor.update(elapsedTime);
if (Input.getState(Input.KEY_LEFT) == Input.DOWN) {
this.setGameState(SpriteState.values()[(current_state.ordinal()-1)]);

} else if (Input.getState(Input.KEY_RIGHT) == Input.DOWN) {
this.setGameState(SpriteState.values()[(current_state.ordinal()+1)]);
}
}

public void setGameState (SpriteState s) {
actor.changeDuration(s.duration());
actor.setDirection(s.direction());
hud.setDescription(s.Description());
System.out.println("Nouvel etat : "+ current_state.ordinal());
}

En java 1.4, les enums ne sont qu’en réalité un tableaux de valeurs entières (int).


public class SpriteState {
public static final int ACTOR_BACK = 0;
public static final int ACTOR_STOP = 1;
public static final int ACTOR_WALK = 2;
public static final int ACTOR_RUN = 3;

public static final int[] ANIM_SPEED_VALUES = {1000,0,1000,5000};
public static final String[] ANIM_DESCRIPTION_VALUES = {"En arrière","Au repos","En route","Dépêchons nous"};
public static final int[] ANIM_DIRECTION_VALUES = {-1,0,1,1};
}

Les paramètres de chaque enums ne sont pas liés a nos valeurs d’enum.
Dans l’implémentation du contrôleur, cela se traduit par un test long et peu lisible, avec une logique qui n’est pas forcément isolée de la valeur des paramètres (du coup difficile et pénible à modifier si vos états sont repris dans plusieurs classes);

public void setGameState (int s) {
switch (s) {
case SpriteState. ACTOR_BACK:
CoreSystem.print("Nouvel etat : Arret");
actorSprite.changeDuration(SpriteState.DRESSAGE_ANIM_SPEED[SpriteState.DRESSAGE_ARRET]);
case SpriteState. ACTOR_STOP:
System.out.println("Nouvel etat : Pas");
actorSprite.changeDuration(SpriteState.DRESSAGE_ANIM_SPEED[SpriteState.DRESSAGE_PAS]);
case SpriteState. ACTOR_WALK:
System.out.println("Nouvel etat : Trot");
actorSprite.changeDuration(SpriteState.DRESSAGE_ANIM_SPEED[SpriteState.DRESSAGE_TROT]);
case SpriteState. ACTOR_RUN:
System.out.println("Nouvel etat : Galop");
actorSprite.changeDuration(SpriteState.DRESSAGE_ANIM_SPEED[SpriteState.DRESSAGE_GALOP]);
}
}

NDA : vous aurez compris le principe il manque a ce sample code la mise a jour du hud et de la direction de l’animation

Toutefois, si vous voulez réimplémenter le comportement des enums en java, cela est possible, avec un peu de travail en plus. Le pattern s’appelle « Typesafe Enum ». A vous de trouver le bon compromis …
implémenter les enums sur java 1.4 : http://www.javacamp.org/designPattern/enum.html
référence : http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html

Entry filed under: java. Tags: .

Clé composites en SQL backup your mysql database everynight with a shell script.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Trackback this post  |  Subscribe to the comments via RSS Feed


Articles récents


%d blogueurs aiment cette page :