2010-01-17 25 views
46

He leído Java no admite static variables locales a diferencia de C/C++. Ahora, si quiero codificar una función con una variable local, cuyo valor debe persistir entre las llamadas a funciones, ¿cómo hago eso?
¿Debo recurrir al uso de variables de instancia?¿Cómo creo una variable local estática en Java?

+0

esta es la razón por la cual Java necesita cierres (es broma). –

+0

@darren: ¿Qué tienen que ver los cierres con los locales estáticos? – missingfaktor

+9

quería locales estáticos (en un sentido C) para mantener el estado a través de llamadas a múltiples funciones. En otras palabras, tener locales existen después de que la función regrese. Este es un uso de cierres. –

Respuesta

29

Puede tener una variable de clase estática, que se conservará en todas las instancias de la clase. Si es lo que quieres. De lo contrario, utilice una variable de instancia, que solo se conservará a través de llamadas a métodos en este objeto.

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

    public int baz() { 
     return 3 * bar; 
    } 
} 
+7

Creo que en la mayoría de los casos * las variables de instancia * deberían estar bien, si lo que @gameover quiere es algo para reemplazar las variables locales estáticas del método. – bryantsai

+0

Estoy de acuerdo. Es bastante raro querer una variable estática no final. Sin embargo, la asignación de números de identificación a los objetos es un ejemplo: almacene el último número de ID utilizado como variable estática. assignID() devuelve lastID + 1 –

+5

@EllieP. 'return lastID ++;' – Cruncher

4

Should I resort to using instance variables?

sí - después de todo, para eso están las variables de instancia. Almacenan el estado entre invocaciones de los métodos del objeto. Tener variables de clases estáticas puede lograr el mismo resultado, pero puede hacer que su programa sea más acoplado y más difícil de probar/simular/mantener.

4

Si desea volver a utilizar el valor variable entre llamadas a funciones y aislar esta variable de otros métodos, debe encapsular en un objeto. En primer lugar, definir una clase con sólo las variables de la electricidad estática "como" y la función que necesita:

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

Luego, a partir de su código de cliente:

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

Ahora bien, si func se basa en el estado interno de Foo usted puede pasar los datos relevantes a través de call() o pasar una instancia de Foo y dejar que la función de llamar los captadores apropiados:

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

¿Por qué tiene que ser tan complicado? ¿La colocación estática int myVar en una función miembro entra en conflicto con alguna parte del lenguaje o característica java? No estoy de acuerdo con que sea raro querer algo de este tipo tampoco. Tal vez necesito alguna función para mantener el estado de una variable y no quiero que todas las demás funciones dentro de la clase tengan acceso a esa variable. Es mucho mejor tener la variable más cerca de donde se usa. Supongo que podría colocar la variable justo encima de la función, pero eso aún permite confusión cuando otras funciones pueden estar usando el mismo nombre de variable. – user1164199

+0

Cuando dije "¿Situar static en myVar en una función de miembro entra en conflicto con alguna parte del lenguaje o característica java?", Quise decir "¿sería posible agregar esta función de idioma en una futura versión de Java?" – user1164199

5

Las variables locales son variables dentro de un método. Solo el método tiene acceso a estas variables. no puede tener una variable local estática, pero puede usar variables de instancia o variables de clase.

Si tiene su método como estático, que de forma predeterminada crea una copia de este método para todos los objetos y no se puede desglosar más, ya que las variables locales limitan su acceso solo al método en el que residen.

-3

final int intVar = 1; // Será ingresado solo una vez. Se comporta como var local estática de C++ en el método.

+2

Esta es una respuesta engañosa, ya que la única razón por la que 'intVar' se comporta como una variable local estática de C++ en este ejemplo es porque se le ha asignado una constante. p.ej. en 'void method (int arg) {final int intVar = arg; ...} ',' intVar' no se comportará como una variable local estática de C++. –

+0

no puede incrementar o disminuir las variables finales –

-1

En el siguiente ejemplo count se comporta como una variable estática local de , que puede utilizar en C:

public class Foo { 

    private int count = 0; 

    public int getCount() { 
     return count++;    
    } 
} 

No hay estáticas locales variables como soporte de otros idiomas. Ya que Java está muy orientada a la "clase", intenta llevarlo a ese contexto. Si desea simular ese comportamiento, usa una variable de instancia, que solo se usa con este método. Entonces esto es estático para diferentes llamadas al método , no para la clase en sí.

+1

Estático para una sola instancia no me parece muy estático. El punto principal de estática es A) valor global en la clase. No depende de la instancia. B) Evite crear una variable para cada instancia :) – borjab

+0

@borjab: Cierto, pero desde el OP escribió: 'Ahora bien, si quiero codificar una función con una variable local, cuyo valor debe persistir entre las llamadas a funciones, ¿cómo hago eso? ? '... parecía correcto responder con lo obvio. La estática depende un tanto del contexto: para la función dentro de esta instancia, sería 'estática' ... por otro lado, las clases regulares' estáticas' no son muy estáticas entre las diferentes instancias del programa o incluso en dispositivos diferentes ;-) – Levit

0

O marcó una respuesta correcta que no era, o realmente quería variables de clase estáticas, pero la respuesta correcta es básicamente de Levit, o técnicamente una mezcla de todas las respuestas.

Para personas de un fondo C como yo, que realmente desean funciones estáticas variables locales puramente para la ventaja de alcance sobre globales, parece que la respuesta es que no se puede en Java.No sin hacer algo como @paradigmatic, se está buscando una instancia de una clase con un static global y getter() único para la instancia de la clase en la que está ejecutando su función.

Si, como sospecho, usted ' volver a ejecutar la clase como Singleton, o completamente estático como el programador de procedimientos inalambrico que todos comenzamos como, la respuesta de @Ellie P o @ user2626445 funcionaría bien ya que ninguna otra instancia va a arruinar su global. Pero para lograr lo que creo que es lo que quieres, en realidad debería ser solo una variable de instancia, que es global en C. Persisten en llamadas de función pero permiten que tu función se use de manera OO, por lo que múltiples instancias pueden mantener su propia variables persistentes para esta función en particular.

Personalmente, me sale esto en jave de la misma manera que me sale de Hi-Tech C no permitiendo las variables de bit de función, al declarar el global en el archivo justo encima de la declaración de la función. De esa forma, cuando hackeo el código más tarde, es menos probable que piense que es global y que tenga la tentación de meterse con él. ¿No es por eso que encapsulamos las cosas?

Cuestiones relacionadas