Définition des variables par nom en Java
Je suis à la recherche d'implémenter quelque chose en Java le long des lignes de:
class Foo{
private int lorem; //
private int ipsum;
public setAttribute(String attr, int val){
//sets attribute based on name
}
public static void main(String [] args){
Foo f = new Foo();
f.setAttribute("lorem",1);
f.setAttribute("ipsum",2);
}
public Foo(){}
}
...où une variable est basée sur le nom de la variable, sans les noms de variable codée en dur et sans recourir à d'autres structures de données. Est-ce possible?
source d'informationauteur Mat Kelly
Vous devez vous connecter pour publier un commentaire.
Voici comment vous pourriez mettre en œuvre
setAttribute
l'aide de la réflexion (j'ai renommé la fonction; il existe différents réflexion fonctions pour les différents types de champ):En général, vous voulez utiliser la Réflexion. Voici une bonne introduction à la sujet avec des exemples
En particulier, "l'Évolution des Valeurs des Champs" section décrit comment faire ce que vous voulez faire.
Je note que l'auteur dit, "Cette fonctionnalité est extrêmement puissant et n'a pas d'équivalent dans d'autres langues conventionnelles." Bien sûr, dans les dix dernières années (l'article a été écrit en 1998), nous avons vu de grands progrès accomplis dans la dynamique des langues. Le ci-dessus est assez facile à faire en Perl, Python, PHP, Ruby, et ainsi de suite. Je suppose que c'est la direction que vous peut venir d'basé sur le "eval" tag.
Aussi, jetez un oeil à BeanUtils qui peuvent cacher une partie de la complexité de l'utilisation de la réflexion à partir de vous.
En fonction de l'utilisation, vous pouvez utiliser la réflexion, comme indiqué ci-dessus, ou peut-être une HashMap serait mieux adapté...
La question est spécifique à ints, ce qui est utile, cependant, voici quelque chose d'un peu plus général. Ce type de méthode est utile si vous êtes en cours de chargement dans
String
représentations de nom du champ /valeur du champ paires.Vous pourriez vouloir mettre en cache certaines des données de réflexion pendant que vous y êtes: