web-dev-qa-db-fra.com

Comment créer une variable locale statique en Java?

J'ai lu Java ne prend pas en charge 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 je fais ça?
Dois-je recourir à l'utilisation de variables d'instance?

51
gameover

Vous pouvez avoir une variable de classe statique, qui sera préservée dans toutes les instances de la classe. Si c'est ce que tu veux. Sinon, utilisez une variable d'instance, qui ne sera préservée que lors des appels de méthode sur cet objet.

public class Foo {
   static int bar;
   //set bar somewhere

   public int baz() {
      return 3 * bar;
   }
} 
33
Ellie P.

Si vous souhaitez réutiliser la valeur de variable entre les appels de fonction et isoler cette variable des autres méthodes, vous devez l'encapsuler dans un objet. Tout d'abord, définissez une classe avec uniquement 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 s'appuie sur l'état interne de Foo, vous pouvez soit passer les données pertinentes via call() soit passer une instance de Foo et laisser la fonction appeler les getters appropriés:

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() {  /*...*/  }
 }
6
paradigmatic

Les variables locales sont des variables à l'intérieur d'une méthode. Seule la méthode arrive à 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 votre méthode est statique, elle crée par défaut une copie de cette méthode pour 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.

5
user2626445

Dois-je recourir à l'utilisation de variables d'instance?

oui - après tout, c'est à cela que servent les variables d'instance. Ils stockent l'état entre les invocations des 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.

4
Chii

Soit vous avez marqué une réponse correcte qui ne l'était pas, soit vous vouliez en fait des variables de classe statiques - mais la bonne réponse est essentiellement Levit's, 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 statiques fonctionnelles locales uniquement pour l'avantage de la portée sur les globaux, il semble que la réponse soit impossible 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 inutilement procédural que nous avons tous commencé en tant que, la réponse de @Ellie P ou @ user2626445 fonctionnerait bien car aucune autre instance ne va bousiller votre global . Mais pour atteindre ce que je pense 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 d'être utilisée dans un OO Ainsi, plusieurs instances peuvent conserver leurs propres variables persistantes pour cette fonction particulière.

Personnellement, je contourne cela en jave de la même manière que je contourne Hi-Tech C en n'autorisant 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, lorsque je piraterai le code plus tard, il est moins probable que je pense que c'est un global et que je suis tenté de jouer avec lui - n'est-ce pas pourquoi nous encapsulons les choses?

0
Alex K

Dans l'exemple suivant, count se comporte comme une variable statique locale , que vous pourriez 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 le mettre dans ce contexte. Si vous voulez simuler ce comportement, vous utilisez une variable d'instance, qui n'est utilisée que par cette méthode. C'est donc statique pour différents appels de méthode , pas pour la classe elle-même.

0
Levit