2009-03-26 15 views
5

In C++ abbiamo lo schema Acquisizione risorse (RAII), che semplifica notevolmente la gestione delle risorse. L'idea è di fornire un oggetto di avvolgimento per qualsiasi tipo di risorse. Il distruttore dell'oggetto wrapping è quindi responsabile del rilascio delle risorse quando esce dal suo ambito. Ad esempio:È possibile la gestione delle risorse in C++ in Java

{ 
    auto_ptr<int> smartPointer = new int; 
    // some other code 

} // the memory allocated for the int is released automatically 
    // by smartPointer's destructor 

L'utilizzo più comune sono i puntatori intelligenti. Ma ci sono molti altri tipi di risorse (file, mutex, socket, ecc.) Che possono essere gestite esattamente nello stesso modo.

In Java non è necessario preoccuparsi della gestione della memoria. Ma restano tutti gli altri tipi di risorse. C'è il blocco , infine, ma il suo utilizzo è piuttosto scomodo, specialmente quando si possono lanciare molte eccezioni.

Quindi, la mia domanda è se esiste un modello Java che fornisce funzionalità equivalenti a C++ RAII? In caso contrario, si prega di condividere le migliori pratiche in quest'area (invece che alla fine, a meno che non sia usato in modo sofisticato).

+0

Vedere questa domanda: http://stackoverflow.com/questions/194261/raii-in-java-is-resource-disposal-always-so-ugly-was-i-had-a-dream – Eclipse

+0

Anche: http : //stackoverflow.com/questions/477399/does-java-support-rai-deterministic-destruction – Eclipse

+0

"che semplifica enormemente la gestione delle risorse" mi stai prendendo in giro? – hasen

risposta

10

È possibile utilizzare il solito acquire; try { use; } finally { release; }. In alternativa è possibile astrarre la gestione delle risorse con lo Execute Around idiom.

4

Joshua Bloch ha proposto l'aggiunta di un meccanismo chiamato Automatic Resource Management a Java come parte del progetto della moneta (piccoli cambiamenti di lingua per JDK 7):

+0

Che è solo zucchero (utile) sintattico per try/catch/finally. Quindi se vuoi fare qualcosa oggi (al contrario del 2011), vedi le risposte su try/catch/finally. –

+2

Tranne che prova/finalmente fa schifo in confronto a RAII. La domanda iniziale era se Java avesse qualcosa di paragonabile a RAII, e la risposta è, apparentemente, no. –

1

Per molti programmatori, la forza del linguaggio RAII è che la vita del sottostante la risorsa è legata a un blocco di scope, rendendo le cose più semplici da realizzare e mantenere; in definitiva riducendo gli errori dal mancato rilascio di quella risorsa.

Purtroppo non è possibile simulare questo comportamento in Java poiché non è possibile creare le proprie strutture associate all'ambito. Un linguaggio simile a Java, che ha cercato di risolvere questo problema è C#:

// explicit release 
MyClass obj = MyClass(); 
obj.UseIt(); 
obj.Dispose(); 

// RAII-like (scope-bound) release 
using(MyClass obj = new MyClass()) 
{ 
    obj.UseIt(); 
} 

Forse vedremo funzionalità come questo implementato in futuro.

+0

python ha aggiunto anche questo con il costrutto 'with' – hasen

+0

Questo non è vero. Puoi certamente simularlo in java come suggerito da Tom Hawtin - tackline. – kirakun

+0

@ Kirakun: simulare "it"; uno scopo? La mia fronte è appena cresciuta di un centimetro. –

Problemi correlati