OVH Cloud OVH Cloud

ForName trouble

13 réponses
Avatar
toto
Bonjour,

Je vous expose mon problème.
Je précise que maintes recherches sur google
et dans les meilleurs librairies ne m'ont pas éclairées.

J'ai crée une classe pour simuler une énumération :

public final class NumeroCase {
private final String name;
public static final NumeroCase out = new NumeroCase("0ut");
public static final NumeroCase c1 = new NumeroCase("1"),
c2 = new NumeroCase("2"),
c3 = new NumeroCase("3"),
......
.....
C44 = new NumeroCase("44");

private NumeroCase(String name) {
this.name = name;
}
public String toString() {
return name;
}
}

Maintenant à l'intérieur d'une autre classe
je veux parcourir les éléments de cette énumération :

for (int i = 1; i <= 44; i++) {
Class clnc = null;
try {
clnc = Class.forName("NumeroCase.c" +
i,true,ClassLoader.getSystemClassLoader());
Object o = clnc.newInstance();
......
.....

Et bien voilà : ça ne marche pas ....le ClassLoader me dit qu'il ne trouve
pas
les classes NumeroCase.Ci

Merci de votre aide

3 réponses

1 2
Avatar
jocelyn
Je sais pas bien ce que tu veux faire reellement en fait...
Il faudrait que tu nous en dise + sur ton type enumere et ses valeurs.

J'ai pense a un truc comme ca en l'absence d'elements supplementaires:

public final class NumeroCase {
private static int NB_MAX = 5;
private final String name;

private static NumeroCase[] tableauNumeroCase = new NumeroCase[NB_MAX];

static {
for (int i = 0; i < NB_MAX; i++) {
tableauNumeroCase[i] = new NumeroCase("Exemplaire n°" + i);
}
}

public static NumeroCase[] getTableauExemplaires() {
return tableauNumeroCase;
}
private NumeroCase(String name) {
this.name = name;
}
public String toString() {
return name;
}
}

et pour l'emploi de tout ca tu peux faire une simple boucle:
for (int i = 0; i < NumeroCase.getTableauExemplaires().length; i++) {
NumeroCase unExemplaire = NumeroCase.getTableauExemplaires()[i];
System.out.println("" + unExemplaire);
}

Mais cela signifie qu'il y'a une regle permettant de lier i et l'exemplaire
n°i de NumeroCase...

"toto" a écrit dans le message news:
6ozVb.8584$
Arrghh...en fait ça ne marche pas.

Je ne veux pas accéder au constructeur de la
classe d'énumération (et pour cause : il est privé)

Je veux accéder aux instances de cette classe
i.e. : NumeroCase.c1, NumeroCase.c2...

En fait je voudrais un truc du genre.
NumeroCase ci = NumeroCase.Ci

Si je fait :
NumeroCase c1 = NumeroCase.c1...ça marche bien sûr.

Mais je vais pas faire 44 déclarations.

Donc je veux par exemple :
NumeroCase c + toString(i) = NumeroCase.c + toString(i)






Avatar
toto
OK.

La classe NumeroCase représente les cases
d'un jeu de plateau.

La classe elle-même, ne me pose pas de problème,
enfin je l'ai résolu par un copier/coller sur le web.

Le problème est qu'elle représente un type énuméré
avec 38 valeurs : les 37 cases du jeu + une valeur qui symbolise
le fait pour un pion de ne pas être affecté à une case (début de la partie
ou
mise en hors-jeu)

Maintenant lorsque je manipule les cases durant la partie,
et lorsque je les initialises avec une valeur (qui réprésente une couche de
glace sur
3 niveaux) il me faut un moyen commode i.e. une indexation par un paramêtre
qui puise
ses valeurs dans un ensemble discret et fini dont le cardinal peut-être
vérifié à la compilation.

Mais j'ai finalement trouvé une méthode dans la class Class : getFields
qui me retourne dans un tableau l'ensemble des attributs publics d'une
classe donnée.
Ensuite la classe Fields fournit la méthode get, qui va instancier chaque
attributs (les champs de mon énumération).

Bref, je voulais avoir le maximum de contrôle pré-compilatoire.

Avec un langage comme Ada, le contrôle des types est tellement strict que
lorsque
le compilateur ne signale plus d'erreurs, alors la sémantique est très
souvent correcte.


Merci des nombreuses réponses
Avatar
Sylvain
Faut pas le prendre comme ca.

Et tu n'attends pas, tu vas voir la:

http://java.sun.com/j2se/1.5.0/download.jsp
1 2