Est-il loin de générer des Variables les noms de façon dynamique en Java?
Disons que j'ai besoin de générer des variables pour contenir une entrée de l'utilisateur (je ne sais pas combien ils sont). Sans l'aide de Array
, ArrayList
(et d'autres types de listes et cartes), mon code générer (disons) String
variables X fois avec des noms comme (String var001
, String var002
, String var003
, etc)? Si oui, veuillez fournir des exemples de code.
C'est très bizarre demande... que voulez-vous dire - "je ne sais pas combien il y en a"? Quand allez-vous savoir? Au moment de l'exécution? De toute façon, cela ressemble vraiment à un emploi pour une classe de collection. Pourquoi n'utilisez-vous pas? Pourriez-vous nous en dire plus sur votre problème?
Je sais que c'est bizarre comme demande, mais c'est un problème difficile notre professeur est en train de mettre sur la table. Je suis donc intéressé de plus avec la possibilité de le faire indépendamment de sa facilité d'utilisation! Le seul truc autour de ce que mon groupe est quoi "Markus Lausberg" déjà suggéré à propos de cette question...donc, il y a d'autres moyen de contourner cela?
J'espère que votre professeur ne lit pas de débordement de pile! Quel est son nom?
Je pense que votre professeur signifiait la réflexion. Je n'ai jamais utilisé de réflexion Java, mais la recherche par le biais de l'API, vous n'avez pas associer des identifiants pour les instances de l'objet créé par la réflexion en Java. Il doit sûrement y avoir un malentendu ici.
Demandez à votre professeur si il aimerais que vous programme, les yeux bandés, ainsi - ce qui fait à peu près autant de sens. Les tableaux et les collections existent pour exactement cet effet. Je ne voit même pas comment vous pouvez apprendre quelque chose d'utile à partir d'un tel exercice.
Je sais que c'est bizarre comme demande, mais c'est un problème difficile notre professeur est en train de mettre sur la table. Je suis donc intéressé de plus avec la possibilité de le faire indépendamment de sa facilité d'utilisation! Le seul truc autour de ce que mon groupe est quoi "Markus Lausberg" déjà suggéré à propos de cette question...donc, il y a d'autres moyen de contourner cela?
J'espère que votre professeur ne lit pas de débordement de pile! Quel est son nom?
Je pense que votre professeur signifiait la réflexion. Je n'ai jamais utilisé de réflexion Java, mais la recherche par le biais de l'API, vous n'avez pas associer des identifiants pour les instances de l'objet créé par la réflexion en Java. Il doit sûrement y avoir un malentendu ici.
Demandez à votre professeur si il aimerais que vous programme, les yeux bandés, ainsi - ce qui fait à peu près autant de sens. Les tableaux et les collections existent pour exactement cet effet. Je ne voit même pas comment vous pouvez apprendre quelque chose d'utile à partir d'un tel exercice.
OriginalL'auteur M. A. Kishawy | 2009-07-28
Vous devez vous connecter pour publier un commentaire.
Suivant est le chemin que j'ai mis en œuvre et m'a aidé à résoudre mon solution facilement sans trop d'obstacles.
//Création de la Liste de tableau
Itération de la boucle, et en ajoutant les objets dans la liste de tableaux avec l'index.
//Récupération de l'objet au moment de l'exécution avec l'aide de l'indice
OriginalL'auteur gmhk
Si vous vraiment voulez faire quelque chose comme ça, vous pouvez le faire par le bytecode de la génération à l'aide de ASM ou d'une autre bibliothèque.
Voici le code qui permettra de générer une classe nommée "toto.bar.ClassWithFields" qui contient les champs "var0" à "var99". Bien sûr, il n'existe aucun moyen autre que la réflexion et l'accès à ces champs, parce qu'ils n'existent pas au moment de la compilation et Java est un langage statiquement typé.
Il utilise l'ASM bibliothèque de générer une classe - le tableau d'octets est dans le même format que le .fichiers de classe Java compilateur produit et charge ensuite à la machine à l'aide d'un class loader personnalisé. ASM travaille au bytecode Java niveau (similaire à l'assemblée de code), afin de comprendre le code ci-dessus, vous devez d'abord apprendre quelques bytecode Java (ASM de la documentation est bon pour cela: download.forge.objectweb.org/asm/asm-guide.pdf). Certains autres bibliothèques de manipulation de bytecode peut être plus facile à utiliser que l'ASM, parce qu'ils sont de niveau plus élevé que la pure bytecode. Je pense que Javassist est une telle bibliothèque.
OriginalL'auteur Esko Luontola
Créer des fichiers avec ces noms. Espérons que ce sera le travail de votre professeur.
Ou utiliser le Java API de Script mentionné avant:
MODIFIER
Semble être intérieur, cette volonté d'utiliser des Cartes 🙂 Même avec un fichier de Propriétés, Préférences de l'API, ou DOM Arbres (ils sont à l'aide de Vecteurs). Donc, si votre professeur est si pointilleux, l'utilisation des fichiers.
OriginalL'auteur Denis Tulskiy
Je n'ai pas vu cette réponse, je vais donc aller pour elle. Écrire un programme qui écrit simplement le code source Java. La plupart de ce pourrait être un modèle, et vous serait tout simplement avoir une boucle qui permettrait d'écrire autant de "chaîne de UserString003" type de variables que vous le souhaitez.
Oui, c'est horrible. Mais, comme vous l'avez dit, c'est un défi conceptuel problème pour les devoirs, donc tant que personne ne les erreurs, cette pour de "bonnes" code, il est susceptible de résoudre le problème.
OriginalL'auteur Beska
Nommage des variables comme ça a l'air très 1980-ish. Signification préalable de la programmation orientée objet.
Donc si jamais vous logiciel de construction pour une vie - NE fais PAS CELA.
Mais puisque cela semble devoirs...
Quand nous parlons d'un nom de variable en Java, nous entendons quelque chose qui est compilé. Contrairement à certains langages de script il n'y a pas de moyen facile de le faire en Java.
Donc, soit vous utilisez un runtime classe compilée comme Markus Lausberg suggéré.
Ou vous tentez de tricher et d'utiliser le Java API de Script et d'utiliser des langages de script. De cette façon, vous pouvez créer un code (dans une Chaîne de caractères) à l'exécution.
OriginalL'auteur Stroboskop
Je pense que vous pouvez générer une classe Java au moment de l'exécution ou peut-être utiliser certaines moteur de script comme Beanshell pour générer les variables, vous pouvez même créer la classe par son bytecode. Mais je ne vois pas comment vous allez utiliser des variables dans votre code, vous devez également créer le code pour travailler avec des variables, ou utiliser la réflexion pour que...
Une solution naïve:
créer une classe avec toutes les variables de var000 à var999 avec un getter pour chaque... mais ce n'est pas vraiment dynamique!
OriginalL'auteur Carlos Heuberger
Il ressemble à votre professeur est PHP-biaisé sur la fonctionnalité (Les variables), de sorte qu'il a été de penser si cela était possible en java.
Personnellement, je ne pense pas que cela est possible, pas de la manière que vous proposez. Ce qui peut être fait est la génération des classes au moment de l'exécution, à l'aide d'outils comme Javassist pour faire un reflet plus puissant mécanisme. Vous pouvez donc créer une classe qui a les variables que vous voulez (chaîne1, chaîne2, etc.) au moment de l'exécution.
Cependant, n'oubliez pas que Les variables est vraiment une mauvaise technique, ce qui conduit à un mauvais code. Il pourrait être utile que dans de très rares cas, mais je n'ai vraiment pas le recommander.
OriginalL'auteur Edison Gustavo Muenz
Vous dire que vous souhaitez générer des variables nommées
var0, var1, var2 et les utiliser dans votre code.
Quelle est la différence lorsque vous utilisez
var[0], var[1], var[2], .....
MAIS
Vous pouvez générer une classe Java dynamiquement à l'exécution, qui implémente une Interface que vous utilisez dans votre code. Puis, vous devez compiler cette classe à l'aide d'un compilateur (Par exemple Janino) et puis charger la classe au moment de l'exécution. Que vous avez créé une classe dynamiquement.
Mais je me demande, si cela est nécessaire pour votre cas d'utilisation.
MODIFIER
Je n'ai pas maintenant pour les cas d'utilisation qui vous êtes à l'aide de ces paramètres, mais dynamique arguments que vous pouvez utiliser en Java comme ce exemple à partir d'ici
OriginalL'auteur Markus Lausberg
Ce n'est pas possible, mais c'est un candidat parfait pour l'utilisation de java collections.
Soit utiliser un tableau alloué dynamiquement:
Ou une liste qui peut changer de taille au cours de l'exécution:
Désolé, je ne vois pas de balise PHP dans cette question...
OriginalL'auteur Yuval Adam
Je ne sais pas si je vous ai bien compris, mais si vous essayez d'utiliser dynamiquement créé des noms de variables, alors oui, certainement - je fais comme ceci:
Comme vous pouvez le voir le point clé ici est le signe "$" qui dit en gros "créer un nom de variable de la Chaîne qui est donné après ce signe", et c'est en fait elle - fonctionne comme un charme pour moi depuis quelques années maintenant...j'espère que c'est ce que tu voulais et que ça aide un peu à la résolution de votre problème.
myDynamicallyCreatedName
et le code de toujours faire la même chose. Il crée une variable nommée$myDynamicalyCreatedName
.Eh bien, curieusement, cela certainement le travail: une certaine partie de mon code est de créer des matériaux (comme les couleurs spécifiques avec des caractéristiques de la surface métallique, brillant, verre, etc.), J'ai comme 3 couleurs différentes de matériel spécifique (disons "chrome"), chaque document doit avoir nom unique - maintenant, je suis en utilisant le même script pour tous chrome matériaux et chacun de ceux qui a créé son unique créé dynamiquement le nom de la façon dont je l'ai décrit ci-dessus...maintenant, dites-moi ce qui est faux comme je le vois travailler sur une base quotidienne! 😉
Peut-être que vous n'êtes pas à l'aide de Java? Si créées dynamiquement les noms travaillé de cette façon, vous devriez être en mesure de le faire:
String name = "myVar"; int $name = 1; System.out.println(myVar);
Mais qui ne fera même pas compiler.Voyez, je ne suis pas JAVA gourou merci donc de ne pas me donner ce rethorical question, je ne sais pas pourquoi ni comment, mais il a certainement travailler pour moi - tout compiler sans problème et fonctionne comme un charme, s'il ne serait pas chaque nouveau matériel de la même classe (dans ce cas, google Chrome) serait de remplacer la précédente qui, elle ne le fait pas: tous ont leurs propres noms ou mieux dit pas des noms comme .setName() mais les "noms" lorsque vous initialisez (l'anglais n'est pas ma langue maternelle, désolé)...BTW, j'essaierais plutôt d'un Système..println($nom);
Je pense que ce qui se passe, c'est que vous êtes en train de créer une variable nommée
$myDynamicalyCreatedName
. La valeur demyDynamicalyCreatedName
n'est pas pertinent. En fait,myDynamicalyCreatedName
n'a même pas besoin d'exister.OriginalL'auteur theoneiam