Création d'objet de classe avec nom concaténé

Fermé
NeoJava - 17 nov. 2020 à 09:45
 NeoJava - 4 déc. 2020 à 14:16
Bonjour

J'ai un problème de manipulation de variable qui pourrait sembler banal, mais dont je n'arrive pas à trouver de solution.
Imaginons une classe : class Ma_Classe { ... }
Et imaginons que je veuille créer 10 objets de cette classe, je vais devoir écrire 10 instructions, depuis "Ma_Classe Mon_Objet_1 = new Ma_Classe() ;" jusqu'à "Ma_Classe Mon_Objet_10 = new Ma_Classe() ;" .

Je me suis dit qu'il serait plus malin de faire une boucle de i = 1 à i= 10.
de concatener "Mon_Objet_" et i , dans une variable.
et de n'utiliser qu'une seul ligne "Ma_Classe ici_on_utilise_le_mot_concaténé = new Ma_Classe() ;"
donc la valeur concaténé deviendrait un nom de variable.

Celà semble tout bête mais je n'y arrive pas après de longues recherches, j'ai même essayé avec des contenus de tableau.
Quelqu'un saurait il me renseigner ?

6 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
17 nov. 2020 à 10:22
Bonjour,

Je ne fais plus de Java depuis longtemps... mais la "logique" reste à peu près la même dans tous les langages...

Quelle est l'utilité d'instancier x objets de façon "dynamique" ( via une boucle) dans des variables différentes (Mon_Objet_1, Mon_Objet_2 .. ) sachant que, dans ton code, tu devras de toutes façons utiliser le "nom" de ces variables pour les manipuler...

A la limite, il vaudrait mieux stocker tes différentes instances dans un array
exemple : https://www.softwaretestinghelp.com/array-of-objects-in-java/#:~:text=One%20way%20to%20initialize%20the,assign%20data%20to%20the%20objects.

0
Bonjour et merci pour la réponse.

J'ai regardé le principe de création d'instances par Array, je ne connaissais pas, cela pourra me servir dans d'autres occasions, mais pas dans le cas présent, j'explique pourquoi :

Dans mon projet, j'ai obtenu de standardiser les noms des instances (Process14_Jalon2, Process6_Jalon10, ...).
Il n'y a que deux nombres qui varient. Il va y avoir plusieurs dizaines d'instances à créer, le programme serait plus léger si on pouvait faire des boucles en incrémentant les nombres.

Mais il y a plus important, j'ai une deuxième raison, si j'arrive à concaténer le nom des instance pour la création, je pourrai concaténer pour l'utilisation (lecture / écriture du contenu) et pour cela je n'ai pas de plan B car ce sont des données provenant d'un fichier EXCEL qui va m'indiquer sur quelle instance travailler.
Une cellule EXCEL va me demander d'utiliser par exemple l'instance "Process14_Jalon2", pour cela je vais forcément passer par une variable, qui doit devenir un nom d'instance.

J'espère avoir bien expliqué mon problème.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
23 nov. 2020 à 12:59
Bonjour,

Pour répondre d'emblée à la question, il n'est pas possible de concaténer un nom d'attribut pour y accéder, une telle concaténation serait le résultat de l'exécution alors que le nom d'attribut doit être résolu à la compilation.

Tu devrais regarder le fonctionnement des Map qui permettent de stocker des couples clé/valeur dont les clés pourraient correspondre ici à ta concaténation. Exemple :
import java.util.*;

public class Test {
    public static void main(String[] args) {
        Map<String, String> map = new TreeMap<>();
        map.put("Process14_Jalon2", "toto");
        map.put("Process6_Jalon10", "tata");

        String value1 = map.get("Process14_Jalon2");

        int process = 6, jalon = 10;
        String value2 = map.get("Process" + process + "_Jalon" + jalon));

        System.out.println(value1); // toto
        System.out.println(value2); // tata
    }
}
0
Bonjour et merci pour cette réponse.
J'ai fait des essais par rapport à ta proposition d'utilisation de Map, mais mon projet doit être construit de cette manière

Map<String, String> Process14_Jalon2 = new TreeMap<>();
Map<String, String> Process6_Jalon10 = new TreeMap<>();
Process14_Jalon2 .put("data1", "toto");
Process14_Jalon2 .put("data2", "tata");

Et donc j'en suis réduit au même problème
Concaténer "Process" + 14 + "_Jalon" + 2 , pour savoir dans quel Map travailler.
Hélas ça ne fonctionne pas non plus pour les Map.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
30 nov. 2020 à 12:52
Bonjour

je ne code pas en Java, mais comme le dit Jordane, c'est plus ou moins la même chose dans tous les langages.

En lisant ce fil, j'ai deux impressions.
La première c'est que tu confonds nom de variable et donnée.

Pour l'ordinateur, pour les autres appareils ou logiciels avec lesquels ton programme pourraient communiquer et pour l'utilisateur, le nom de variable n'a aucune importance, car ils n'y ont pas accès. Qu'une variable s'appelle "a", "truc", "rien" ou "Process14_Jalon2" ne change strictement rien.

Un nom de variable, ça n'a d'utilité que pour le codeur (ou une équipe de codeurs) ne pas se mélanger les pinceaux.

Ce qui répond exactement à
Il va y avoir plusieurs dizaines d'instances à créer
et à
car ce sont des données provenant d'un fichier EXCEL qui va m'indiquer sur quelle instance travailler.
Une cellule EXCEL va me demander d'utiliser par exemple l'instance "Process14_Jalon2", pour cela je vais forcément passer par une variable, qui doit devenir un nom d'instance.


C'est un map, comme te l'a proposé KX.

Ta réponse de ce matin, montre que tu n'as pas compris à quoi ça sert et comment on l'utilise.

De plus
Il va y avoir plusieurs dizaines d'instances à créer
avec des variables, démontre une erreur de conception du projet.

Ce qui m'amène à me seconde impression, tu es autodidacte, tu débutes, et comme beaucoup tu as mis la charrue avant les boeufs.
Tu t'es lancé bille en tête dans ton projet, sans prendre la peine d'apprendre quelques bases.

Si c'est bien le cas, le meilleur conseil que je puisse te donner est de laisser ton projet de coté quelques jours, pour suivre un cours en ligne. KX saura sûrement t'en proposer un bien.
Ça te donnera le socle nécessaire à ton apprentissage.


0
Bon OK , j'ai bien avancé dans mon projet et je butte sur ce problème.
Je vais présenter ma structure de variables et vous me direz si il y a mieux à faire.
S'il faut que je change, il n'y a pas de problème pour moi.

Imaginons une production composée de 10 processus qui se suivent.
Chaque processus est subdivisé en 6 jalons.
Ce qui me donne :
Process1_Jalon1
Process1_Jalon2
Process1_Jalon3
.... etc jusqu'à
Process10_Jalon6

Chaque Jalon contient 4 données à mémoriser, je les ai nommé Data1, Data2, Data3 et Data4.
Ce qui me donne comme variables de travail, pour le jalon 1 du process :
Process1_Jalon1.Data1
Process1_Jalon1.Data2
Process1_Jalon1.Data3
Process1_Jalon1.Data4
Tous cela à reproduire dans 10 x 6 jalons.

Vu la structure, j'ai pensé que ce serait bien de disposer ces variables sous forme de Classe/Objet, comme j'ai expliqué au début.
J'ai bien compris que j'aurais aussi pu distribuer mes variables sous forme de tableaux.

Dans le projet, je vais recevoir un fichier EXCEL qui contient une certain nombre de variables à relever. Par exemple dans la cellule A1 il y aura écrit : Process1_Jalon1.Data2 .
Mon travail est d'écrire en face de la cellule (donc B1) la valeur de la variable.
Si Process1_Jalon1.Data2 = 10; alors j'écris 10 dans la cellule A2.

Pour faire cette opération, il faut bien que dans mon programme java je réceptionne le contenu du fichier EXCEL quelque part (Ouverture du fichier EXCEL, copie contenu cellule dans une variable, etc...) :
Variable_demande_provenant_de_EXCEL = "Process1_Jalon1.Data2" (qui est le contenu de la cellule A1)
Il Faut bien que je transforme cette valeur de variable "Process1_Jalon1.Data2" en adresse de variable pour retrouver mon Process1_Jalon1.Data2 = 10.

Comment fait on cette conversion, je cherche encore.
Pour tout le reste c'est OK, je sais faire.

Voilà comment j'ai conçu mon projet, s'il y a d'autres idées je ne suis pas contre, sinon dans ce cas présent je n'ai que ce point à terminer.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
30 nov. 2020 à 17:27
Ce qui confirme bien que "Process1_Jalon1" est une donnée, pas un nom de variable. Voire même 2 données, le numéro de process et le numéro de Jalon.

Supposons que c'est une seule donnée.

Map est parfaitement adapté.
Sur la doc d'Oracle on trouve
An object that maps keys to values. A map cannot contain duplicate keys; each key can map to at most one value.

En clair, tu lies 2 données, l'une est une clé et l'autre une valeur.
La clé est unique dans un Map

Dans ton cas la clé sera le texte composé par les numéros process et de jalon.
Dans ton Map, tu ajoutes la clé "Process1_Jalon1" et l'instance de MaClasse associée, puis la clé "Process1_Jalon2" et l'instance de MaClasse associée et ainsi de suite.
Tu peux le faire à partir de 2 boucles puisque la clé est une string.

Par la suite quand, tu as besoin des données de ta classe, tu demandes au Map de te retourner la valeur qui correspond à la clé "ProcessN_JalonM".


Si on considère que les numéro de process et de jalon sont 2 données séparées. Voici 2 façons de faire (parmi d'autre)
  • Soit un map dont la clé est le numéro de process et chaque valeur un autre map dont la clé est le numéro de jalon et la valeur l'instance de ta classe qui va bien. Pour récupérer une instance tu récupères dans un premier temp le map qui correspond à ton process, puis la valeur qui correspond à ton jalon.
  • Soit tu ajoutes un attribut Process et un attribut Jalon à ta classe (comme Data1, Data2 etc...), et tu stockes tout dans un Array. Quand tu as besoin d'une instance, tu fais une boucle dans ce tableau pour trouver l'instance dont les numéros correspondent.


Mais comme je te l'ai dit plus haut, c'est des concepts de bases que tu ne sembles pas avoir acquis.
0
Je ne sais pas si j'ai bien compris tes propositions, mais cela m'a donné une idée, je vais voir si ça marche :

Je vais créer un unique Objet de Classe (Mon_Objet_de_Classe).
A l’intérieur il va y avoir des instances "Process".
Chacun aura des sous instances "Jalon"
et chaque jalon aura des sous sous instances "Data"

Je devais à la base avoir des variables sous la forme :
Process1_Jalon1.Data2 = 10;
(Il ne faut pas se fier à la composition de l'adresse Process + Jalon, c'est le projet qui veut ça, c'est en fait une adresse unique, on aurait pu l'appeler Process_Jalon_102, j'aurais du simplifier mon exemple, mais continuons de la même manière)

J'aurai à présent des variables sous la forme :
Mon_Objet_de_Classe.Process1.Jalon1.Data2 = 10;
Donc avec 3 adresses d' instances pour arriver à la valeur que cherche à lire : "10".
Et les instances, je sais les appeler de manière dynamique avec la fonction java getClass().getField().

Çà va complexifier mon programme, mais si ça fonctionne ce sera mieux que rien.

S'il y a des commentaires, je reste à l'écoute, le temps de faire des essais.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > NeoJava
1 déc. 2020 à 19:14
"S'il y a des commentaires, je reste à l'écoute"
Dans la mesure où tu ne prends pas en compte nos réponses, je ne vois pas trop pourquoi on s'embêterai à commenter ton monologue...

Sachant que pour l'instant tu n'as fait qu'effleurer ton projet dont la principale difficulté est dans la lecture du fichier Excel, autrement plus compliqué que ton histoire de variables où tu galères déjà.
0
NeoJava > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
4 déc. 2020 à 08:19
Ce n'est pas tout à fait exact ce que tu dis.

Pour le traitement d'un fichier EXCEL en java, je n'ai pas de problème, c'est déjà programmé (ce que j'ai déjà indiqué).

Dans mon projet, l'utilisation d'une lecture de cellule java est justement ce qui va produire une sélection de variable avec un dispatching Process, Jalon, data. C'est le fonctionnement de la sélection qui me pose problème.

Je lis les réponses et je les interprète par rapport à ce qui correspond à mon projet et par rapport à ce que j'en comprends; et le gros avantage de ces réponses est que cela me donne des idées et de nouvelles pistes, donc utiles.
Ainsi je crois comprendre que ma distribution des variables par classe/Objet ne fonctionnera pas.
Je pense m'orienter vers une distribution en tableau 3 dimensions ou dans un dictionnaire. Ces solutions fonctionnent, j'ai essayé, mais j'aurais préféré accéder à mes variables par l'usage d'instances d'objet car je trouve cela plus pratique à programmer.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931 > NeoJava
4 déc. 2020 à 13:05
Bonjour

Tout ce qui est dans un tableau, un dictionnaire, un map est une instance.

C’est donc exactement pareil à programmer qu’une variable nommée.....
0
C'est très bien tout ça.
Voilà qui m'a permis de faire le tour de la question, je n'ai plus rien à ajouter.
Merci à tous.
0