2012-04-17 9 views
5

En C, puedo crear una variable estática en una función. El espacio para esa variable no se asigna junto con las variables de función, sino que se asigna al inicio del programa. (No te burles de mi C con demasiada dureza, he estado programando en Java por demasiado tiempo :)Práctica recomendada para definir una variable Java que actúa (algo) como la variable estática local de C

void myFunc(){ 
    static SomeStruct someStruct; 
    someStruct.state=INITIALIZED; 
    goDoSomethingInteresting(MY_COMMAND,&someStruct); 
} 

En Java, si quiero hacer algo similar, puedo crear una variable de clase y luego usarlo .

Class TheClass { 
    SomeStruct someStruct = new SomeStruct(); 
    void myFunc(){ 
    someStruct.setState(INITIALIZED); 
    goDoSomethingInteresting(MY_COMMAND,someStruct); 
    } 
} 

Mi pregunta es ¿cuál es la mejor práctica para hacer algo como esto? Realmente me gustaría asociar mi variable someStruct con mi función myFunc, porque myFunc es el único código que debe conocer o usar someStruct, pero no hay forma de hacer esa asociación excepto para poner la variable cerca de la función en el código. Si lo pones arriba, entonces el Javadoc para la función parece poco claro, si lo pones a continuación, entonces no está muy claro que estén juntos.

Normalmente me acaba de crear someStruct localmente, pero en mi caso es muy costoso crear someStruct, y llamar myFunc en un bucle estrecho.

Respuesta

5

Una clase pequeña asociará someStruct con el comportamiento de myFunc limpiamente, pero es extra adicional para entender y mantener las cosas. Puede valer la pena, podría no serlo.

class TheClass { 
    MyFuncBehavior myFuncer = new MyFuncBehavior(); 
    void myFunc() { 
     myFuncer.myFunc(); 
    } 
} 

class MyFuncBehavior { 
    private static SomeStruct someStruct = new SomeStruct(); 

    public void myFunc() { 
    someStruct.setState(INITIALIZED); 
    goDoSomethingInteresting(MY_COMMAND,someStruct); 
    } 
} 
+0

Esta es probablemente la opción más similar a Java, aunque aún ligeramente confuso y más difícil de mantener. – biziclop

+0

Estoy de acuerdo con @biziclop. Esta es la única forma de hacer lo que pregunto, pero probablemente nunca lo haga a menos que tenga muchas variables similares a 'someStruct'. Tenga en cuenta que este podría ser el caso en un juego de Java donde no desea crear mucho trabajo para el recolector de basura. – JohnnyLambada

0

No creo que tenga mucho sentido tratar de forzar la encapsulación dentro de un solo archivo fuente (es decir, una clase y todas sus clases internas) y Java parece seguir este principio.

Cualquiera con acceso al código fuente puede cambiarlo para tener acceso a cualquier campo.

Sin embargo el rediseño de su código es una opción:

  1. Puede extraer myFunc() en una clase separada, junto con el campo que utiliza.
  2. Simplemente puede cambiar la firma del método a void myFunc(SomeStruct struct) y pasarlo como parámetro. Guárdelo como una variable local de la persona que llama.

Si el lazo es realmente muy ajustado, la sobrecarga será mínima. (Personalmente no haría ninguno de los anteriores.)

+0

Tienes razón en cuanto a la encapsulación dentro de la clase va, pero estoy buscando una manera de dejar claro que 'someStruct' es sólo para ser utilizado dentro de' myFunc'. En C esto es claro porque no está visible en ningún otro lugar. En Java no está claro a menos que escriba un comentario que diga tanto. – JohnnyLambada

+0

@JohnnyLambada Pero ese es exactamente el punto: la unidad principal de encapsulación en Java es la clase. Tratar de meter los conceptos C en él terminará en lágrimas. – biziclop

+0

No, en absoluto, me imagino un nuevo modismo de Java: el local estático. Imagine 'public void myFunc() {static SomeStruct ss = new SomeStruct(); godo (CMD, ss); } ' En mi mundo imaginario, 'ss' ahora es justo lo que quiero, se asigna junto con las variables de nivel de clase, pero solo es visible dentro de' myFunc'. – JohnnyLambada

0

En Java, si quiero hacer algo similar, creo una variable de clase y luego la uso.

Sí, es la mejor práctica.

+0

Lo que realmente me gustaría es una forma de "ocultar" 'someStruct' del resto de la clase en la que vive. – JohnnyLambada

+0

pero ¿por qué una variable local no es suficiente? – dash1e

+0

Porque 'new SomeStruct()' puede llevar mucho tiempo. – JohnnyLambada

2

Como está escribiendo la clase Java, simplemente conviértalo en un miembro privado de su clase. Ponga un comentario al lado si quiere evitar que otras personas que estén trabajando en ese mismo archivo puedan usarlo en otro lugar del archivo.

2

En C una function static variable

  • tiene la vida del programa
  • tiene el ámbito de la función

Es decir, una vez inicializado de que dispone en cada llamada a la función con el último valor asignado pero no es accesible fuera de la función.

Esto se ajustará muy bien si convierte la función en una clase con un método y convierte la variable estática en un miembro de esa clase.

p. Ej.

void F() 
{ 
    static int i; 
} 

Se convierte en

class F 
{ 
    int i; 
    func() .... 
} 
Cuestiones relacionadas