Comment créer une variable locale statique en Java?
J'ai lu que Java ne supporte pas les variables locales static
contrairement à C / C++. Maintenant, si je veux coder une fonction avec une variable locale, dont la valeur doit persister entre les appels de fonction, Comment puis-je faire cela?
Devrais-je recourir à l'utilisation de variables d'instance?
7 réponses
Vous pouvez avoir une variable de classe statique, qui sera conservée dans toutes les instances de la classe. Si c'est ce que vous voulez. Si ce n'est pas le cas, utilisez une variable d'instance, qui sera uniquement conservée entre les appels de méthode sur cet objet.
public class Foo {
static int bar;
//set bar somewhere
public int baz() {
return 3 * bar;
}
}
Si vous voulez réutiliser la valeur de la variable entre les appels de fonction et isoler cette variable d'autres méthodes, vous devez l'encapsuler dans un objet. Tout d'abord, définissez une classe avec seulement les variables "statiques" et la fonction dont vous avez besoin:
class MyFunctionWithState {
private int myVar = 0;
public int call() {
myVar++;
return myVar;
}
}
Ensuite, à partir de votre code client:
class Foo {
private MyFunctionWithState func = new MyFunctionWithState();
public int bar() {
return func.call();
}
}
Maintenant, si func
repose sur l'état interne de Foo
, Vous pouvez soit passer les données pertinentes à travers call()
ou passer une instance de Foo
et laisser la fonction appeler la fonction appropriée les accesseurs:
class MyFunctionWithState {
private int myVar = 0;
public int call( Foo f ) {
myVar += f.getBaz();
return myVar;
}
}
class Foo {
private MyFunctionWithState func = new MyFunctionWithState();
public int bar() {
return func.call( this );
}
public int getBaz() { /*...*/ }
}
Les Variables locales sont des variables à l'intérieur d'une méthode. Seule la méthode peut accéder à ces variables. vous ne pouvez pas avoir de variable locale statique, mais vous pouvez utiliser des variables d'instance ou des variables de classe.
Si vous avez votre méthode statique qui crée par défaut une copie de cette méthode à tous les objets et ne peut pas être décomposée davantage car les variables locales limitent leur accès uniquement à la méthode dans laquelle elles résident.
Devrais-je recourir à l'utilisation de l'instance les variables?
Oui-Après tout, c'est à quoi servent les variables d'instance. Ils stockent l'état entre les appels de méthodes de l'objet. Avoir des variables de classe statiques peut en quelque sorte atteindre le même résultat, mais peut rendre votre programme plus couplé et plus difficile à tester/simuler/maintenir.
Soit vous avez marqué une réponse correcte qui ne l'était pas, soit vous vouliez réellement des variables de classe statiques-mais la bonne réponse est fondamentalement celle de Levit, ou techniquement un mélange de toutes les réponses.
Pour les personnes d'un arrière-plan C comme moi, qui veulent vraiment des variables locales de fonction statiques uniquement pour l'avantage de la portée sur les globaux, il semble que la réponse soit que vous ne pouvez pas en Java. Non sans faire quelque chose comme @paradigmatic va avec une instance d'une classe avec un global statique et getter() unique à l'instance de la classe dans laquelle vous exécutez votre fonction.
Si, comme je le soupçonne, vous exécutez la classe en tant que Singleton, ou complètement statiquement comme le programmeur inately procédural que nous avons tous commencé, la réponse de @Ellie P ou @user2626445 fonctionnerait bien car aucune autre instance ne va bousiller votre global. Mais pour réaliser ce que je pense que c'est que vous voulez, il devrait en fait être juste une variable d'instance, qui est un global en C. ils persistent à travers les appels de fonction mais permettent votre fonction doit être utilisée de manière OO, de sorte que plusieurs instances peuvent conserver leurs propres variables persistantes pour cette fonction particulière.
Personnellement, je contourne cela dans jave de la même manière que je contourne Hi-Tech C ne permettant pas les variables de bits de fonction, en déclarant le global dans le fichier juste au-dessus de la déclaration de fonction. De cette façon, quand je pirate le code plus tard, je suis moins susceptible de penser que c'est un global et d'être tenté de le jouer - n'est-ce pas pourquoi nous encapsulons les choses?
Dans l'exemple suivant count
se comporte comme une variable statique locale, que vous pouvez utiliser en C:
public class Foo {
private int count = 0;
public int getCount() {
return count++;
}
}
Il n'y a pas de variables statiques locales comme le support d'autres langues. Puisque java est très orienté "classe", il essaie de l'amener à ce contexte. Si vous souhaitez simuler ce comportement, vous utilisez une variable d'instance, qui n'est utilisée que par cette méthode. C'est donc statique pour les différents méthode appels, pas pour la classe elle-même.
Final int intVar = 1; / / ne sera inited qu'une seule fois. Se comporte comme c++ var local statique dans la méthode.