2010-09-07 11 views
2

J'ai une situation étrange où je veux être capable de persister une variable en mémoire .. comme une variable globale que je peux épingler dans la JVM.java - comment persister variable dans JVM

Est-ce possible? Je me souviens avoir fait quelque chose de similaire à l'université, mais je ne peux pas le trouver en faisant des recherches sur Google. J'ai un problème de logique qui a des contraintes artificielles qui en font la meilleure solution possible.

EDIT 1:

je besoin de mettre à jour la valeur de la variable.

EDIT 2:

Je vous remercie les gars de réponses. Je suis un programmeur .net et n'ai pas utilisé java depuis l'université. Merci encore.

+0

Pourquoi le vote se termine? C'est totalement une vraie question. –

Répondre

5

Oui, en utilisant un champ static:

public class GlobalVariableHolder { 
    public static int globalVariable; 
} 

Notez, cependant, que cela est considéré comme une mauvaise pratique et peut conduire à des résultats inattendus qui sont difficiles à déboguer. La façon de ne pas utiliser une variable globale est de la passer comme un argument ou des méthodes où vous en avez besoin.

Si vous êtes toujours sûr d'avoir besoin de cela, afin de vous protéger autant que possible, utilisez la synchronisation. Encore mieux, si la variable va être primitive (int, long, etc), vous pouvez utiliser la méthode AtomicIntegergetAndAdd() ou addAndGet().

+0

J'ai édité la question. Je devrai pouvoir mettre à jour le var. Merci d'avoir regardé ma question. – Chad

+0

Vous devez vous méfier que le membre statique sera local au ClassLoader! Les piles J2EE peuvent intégrer des applications et des contextes de domaine dans leur propre hiérarchie de chargeurs de classes. Assurez-vous que la classe est chargée au niveau supérieur. – Xailor

1

Voulez-vous dire quelque chose qui existera sur plusieurs invocations de java.exe, ou voulez-vous dire une seule variable qui sera le même emplacement dans la mémoire quel que soit le thread dans java.exe y accéder? Ou voulez-vous dire une variable qui ne peut être accessible que si vous utilisez JRockit? Ou peut-être juste la JVM sur votre machine dev, mais pas sur un autre système?

Dans le premier cas, vous auriez besoin d'un autre moyen de le stocker, comme un fichier de configuration.

Dans le second cas, comme le dit Bozho, utilisez le mot-clé static. Dans le troisième cas, vous devrez probablement utiliser la classe System et déterminer le fabricant de la JVM (en supposant que ce soit disponible auprès de System - je ne suis pas sûr de moi et vous en apprendrez plus par regarder l'API vous-même). Dans le quatrième cas, vous êtes à peu près de retour dans un fichier de configuration.

0

Sa ne va pas gagner un prix, mais cela devrait fonctionner:

 
package mypackage;

public class MyGlobal { public static String MY_GLOBAL_VAR = "my variable"; }

Toute classe dans cette instance de machine virtuelle Java serait en mesure d'accéder MyGlobal.MY_GLOBAL_VAR.
Mise à jour pour permettre la mise à jour.

+0

pas besoin de le faire en majuscule - ce n'est pas une constante. – Bozho

+0

C'est vrai, mais c'était constant avant de l'éditer :) –

2

Habituellement, vous finirez par stocker ces éléments dans une sorte de classe globale - une classe accessible de n'importe où et ayant un nombre d'instances contrôlé.

Les singletons sont couramment utilisés pour cela. Si vous recherchez le motif pour un singleton et stockez votre variable dans ce singleton (ajoutez un setter et un getter) vous êtes sur votre chemin.Faire ceci (par opposition à une variable statique publique) vous donnera un certain niveau de contrôle d'accès et de traçabilité - par exemple vous pouvez mettre des instructions de débogage dans le getter si vous trouvez que vous obtenez des résultats imprévisibles. À long terme, les régleurs, les getters et les singletons sont tous des mauvaises odeurs de code, mais ils sont loin d'être aussi mauvais qu'une variable publique réglable. Plus tard, vous pouvez déplacer le code qui manipule cette variable dans l'objet singleton et éventuellement convertir le singleton en quelque chose que vous pouvez récupérer via IOC, mais avoir un singleton est un bien meilleur endroit pour démarrer qu'avec un static public.

+0

Votez pour mentionner Singletons! – CoolBeans

+0

Je ne dirais pas qu'il est nécessaire d'implémenter un singleton s'il ne stocke que des données. – Bozho

+0

@Bozho Une variable globale paramétrable est l'une des pires choses que vous pourriez faire, au moins un singleton vous donne un certain contrôle sur la variable. Un singleton correctement implémenté (celui où le code qui manipule la variable est placé dans l'objet singleton lui-même) est beaucoup mieux. Mon hypothèse est que la création du singleton donnera au Tchad une place pour mettre du code et ses compétences de conception évolueront. La création d'une variable globale va entraîner le dédoublement de son code et le copier/coller partout. Je n'ai même pas mentionné les problèmes de threads probables qui peuvent survenir. –