2012-04-17 12 views
5

In C, posso creare una variabile statica in una funzione. Lo spazio per quella variabile non è allocato insieme alle variabili di funzione, è allocato al momento dell'avvio del programma. (Non prendere in giro il mio C troppo duramente, Sono stato di programmazione in Java per troppo tempo :)Best practice per la definizione di una variabile Java che agisce (qualcosa) come una variabile statica locale di C

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

In Java, se voglio fare qualcosa di simile, creo una variabile di classe e poi usarlo .

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

La mia domanda è qual è la migliore pratica per fare qualcosa del genere? Mi piacerebbe davvero associare la mia variabile someStruct con la mia funzione myFunc, perché someStruct è l'unico codice che dovrebbe conoscere o usare someStruct, ma non c'è modo di farlo, se non per mettere la variabile vicino alla funzione nel codice. Se lo metti sopra, allora il Javadoc per la funzione sembra stordito, se lo metti sotto, quindi non è molto chiaro che essi appartengono insieme.

Normalmente vorrei solo creare someStruct a livello locale, ma nel mio caso è molto costoso per creare someStruct, e io chiamare myFunc in un loop stretto.

risposta

5

Una piccola classe associerà someStruct con il comportamento di myFunc in modo pulito, ma è un overhead aggiuntivo per la comprensione e il mantenimento delle cose. Potrebbe valere la pena, potrebbe non esserlo.

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

Questa è probabilmente l'opzione più simile a Java, anche se ancora leggermente confuso e difficile da mantenere. – biziclop

+0

Sono d'accordo con @biziclop. Questo è l'unico modo per fare quello che chiedo, ma probabilmente non lo farò mai a meno che non abbia molte variabili come "someStruct". Si noti che questo potrebbe essere il caso in un gioco Java in cui non si vuole creare molto lavoro per il garbage collector. – JohnnyLambada

0

Non penso che ci sia molto da fare cercando di forzare l'incapsulamento all'interno di un singolo file sorgente (cioè una classe e tutte le sue classi interne) e Java sembra seguire questo principio.

Chiunque abbia accesso al codice sorgente può cambiarlo per avere accesso a qualsiasi campo.

Tuttavia ridisegnare il codice è un'opzione:

  1. È possibile estrarre myFunc() in una classe separata con il campo che utilizza.
  2. È possibile modificare semplicemente la firma del metodo su void myFunc(SomeStruct struct) e passarlo come parametro. Memorizzarlo come variabile locale del chiamante.

Se il ciclo è davvero molto stretto, il sovraccarico sarà minimo. (Personalmente non farei nessuno dei precedenti.)

+0

Hai ragione per quanto riguarda l'incapsulamento all'interno della classe va, ma io sto cercando un modo per far capire che 'someStruct' è solo quello di essere utilizzato entro' myFunc'. In C questo è chiaro perché non è visibile altrove. In Java non è chiaro se non scrivo un commento che dice tanto. – JohnnyLambada

+0

@JohnnyLambada Ma questo è esattamente il punto: l'unità principale di incapsulamento in Java è la classe. Cercando di calzare i concetti di C in esso finirà in lacrime. – biziclop

+0

Niente affatto - Posso immaginare un nuovo idioma Java - il locale statico. Immagina 'public public void myFunc() {static SomeStruct ss = new SomeStruct(); Godo (CMD, ss); } '. Nel mio mondo immaginario, 'ss' è ora quello che voglio: viene assegnato insieme alle variabili di livello di classe, ma è visibile solo all'interno di' myFunc'. – JohnnyLambada

0

In Java, se voglio fare qualcosa di simile, creo una variabile di classe e poi la uso.

Sì, è la migliore pratica.

+0

Quello che mi piacerebbe davvero è un modo per "nascondere" 'someStruct' dal resto della classe in cui vive. – JohnnyLambada

+0

ma perché una variabile locale non è sufficiente? – dash1e

+0

Perché 'new SomeStruct()' può richiedere un tempo mooolto. – JohnnyLambada

2

Dato che si sta scrivendo la classe java, è sufficiente renderlo un membro privato della classe. Metti un commento accanto ad esso se vuoi impedire ad altre persone che potrebbero lavorare su quello stesso file di utilizzarlo altrove nel file.

2

In C una function static variable

  • ha la durata del programma
  • ha lo scopo della funzione

Cioè, una volta inizializzato cui dispone in ciascuna chiamata a la funzione con l'ultimo valore assegnato ad essa ma non accessibile al di fuori della funzione.

Questo si adatta bene se si converte la funzione in una classe con un metodo e si rende la variabile statica un membro di quella classe.

ad es.

void F() 
{ 
    static int i; 
} 

Diventa

class F 
{ 
    int i; 
    func() .... 
} 
Problemi correlati