Come posso creare una variabile locale statica in Java?

Ho letto che Java non supporta variabili locali static a differenza di C / C ++. Ora se voglio codificare una funzione con una variabile locale, il cui valore dovrebbe persistere tra le chiamate di funzione, come posso farlo?
Dovrei ricorrere all’utilizzo di variabili di istanza?

Puoi avere una variabile di class statica, che sarà preservata in tutte le istanze della class. Se questo è quello che vuoi. In caso contrario, utilizzare una variabile di istanza, che verrà conservata solo attraverso le chiamate di metodo su questo object.

 public class Foo { static int bar; //set bar somewhere public int baz() { return 3 * bar; } } 

Se si desidera riutilizzare il valore variabile tra le chiamate di funzione e isolare questa variabile da altri metodi, è necessario racchiuderlo in un object. Innanzitutto, definisci una class con solo le variabili “statiche” e la funzione di cui hai bisogno:

 class MyFunctionWithState { private int myVar = 0; public int call() { myVar++; return myVar; } } 

Quindi, dal tuo codice cliente:

 class Foo { private MyFunctionWithState func = new MyFunctionWithState(); public int bar() { return func.call(); } } 

Ora se func si basa sullo stato interno di Foo puoi passare i dati rilevanti tramite call() o passare un’istanza di Foo e lasciare che la funzione chiami i getter appropriati:

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

Le variabili locali sono variabili all’interno di un metodo. Solo il metodo ottiene l’accesso a queste variabili. non puoi avere una variabile locale statica, ma puoi usare variabili di istanza o variabili di class.

Se il tuo metodo è statico, per impostazione predefinita crea una copia di questo metodo su tutti gli oggetti e non può essere ulteriormente scomposto in quanto le variabili locali limitano il loro accesso solo al metodo in cui risiedono.

Dovrei ricorrere all’utilizzo di variabili di istanza?

sì – dopotutto, è a questo che servono le variabili di istanza. Memorizzano lo stato tra le invocazioni dei metodi dell’object. Avere variabili di class statiche può raggiungere lo stesso risultato, ma può rendere il tuo programma più accoppiato e più difficile da testare / simulare / mantenere.

O hai contrassegnato una risposta corretta che non lo era, o in realtà volevi delle variabili di class statiche – ma la risposta giusta è fondamentalmente quella di Levit, o tecnicamente una miscela di tutte le risposte.

Per le persone provenienti da un background C come me, che desiderano veramente variabili locali di funzione statica puramente per il vantaggio dell’ambito rispetto ai globals, sembra che la risposta non sia ansible in Java. Non senza fare qualcosa come @paradigmatic sta andando con un’istanza di una class con un globale statico e getter () univoco per l’istanza della class in cui si sta eseguendo la funzione.

Se, come sospetto, stai eseguendo la class come Singleton, o completamente staticamente come il programmatore in modo procedurale, iniziammo tutti come, la risposta di @Ellie P’s o @ user2626445 funzionerebbe bene poiché nessun’altra istanza avrebbe rovinato la tua globalità . Ma per ottenere quello che penso che vuoi, dovrebbe essere solo una variabile di istanza, che è globale in C. Persistono tra le chiamate di funzione ma consentono di utilizzare la tua funzione in modo OO, quindi più istanze possono mantenere le proprie variabili persistenti per questa particolare funzione.

Personalmente, mi aggiro in questo modo in jave nello stesso modo in cui mi aggiro con Hi-Tech C non permettendo le variabili bit di funzione, dichiarando il globale nel file appena sopra la dichiarazione di funzione. In questo modo, quando indago il codice in seguito, è meno probabile pensare che sia globale e sia tentato di scherzare con esso – non è per questo che incapsuliamo le cose?

Nel seguente esempio il count si comporta come una variabile locale statica, che è ansible utilizzare in C:

 public class Foo { private int count = 0; public int getCount() { return count++; } } 

Non ci sono variabili locali statiche come il supporto di altre lingue. Poiché java è molto orientato alla “class”, cerca di portarlo in quel contesto. Se si desidera simulare tale comportamento, si utilizza una variabile di istanza, che viene utilizzata solo da questo metodo. Quindi questo è statico per chiamate di metodi diversi, non per la class stessa.

final int intVar = 1; // Verranno inseriti solo una volta. Si comporta come var locale statica C ++ nel metodo.