Domanda

In C++ acquisiamo una risorsa in un costruttore e la rilasciamo in un distruttore.

Pertanto, quando si verifica un'eccezione nel mezzo di una funzione, non si verificherà alcuna perdita di risorse, mutex bloccati o altro.

AFAIK le classi Java non hanno distruttori.Quindi, come si fa la gestione delle risorse in Java.

Per esempio:

public int foo() {    
    Resource f = new Resource();
    DoSomething(f);
    f.Release();
}

Come può una risorsa rilasciare se DoSomething genera un'eccezione?Non possiamo inserire blocchi try\catch in tutto il codice, vero?

È stato utile?

Soluzione

Sì, puoi e dovresti inserire try/catch/finally block attorno al tuo codice.In C# esiste un'istruzione abbreviata "using", ma in Java sei bloccato con:

public int foo() {
    Resource f = new Resource();
    try {
        DoSomething(f);
    }
    finally {
        f.Release();
    }
}

Altri suggerimenti

Questa domanda risale al 2008 e riguarda quindi Java 6.Da allora è stato rilasciato Java 7, che contiene una nuova funzionalità per la gestione automatica delle risorse.Per una domanda più recente rilevante per Java 7 vedere questa domanda:

tecniche Java per il rilascio automatico delle risorse?"pulizia immediata"?

È possibile escludere try/finally (e eccezioni e algoritmi) utilizzando l'idioma Execute around.Tuttavia la sintassi è molto dettagliata.

public int foo() {
    withResource(new WithResource() { public void run(Resource resource) {
        doSomething(resource);
    }});
}

...

public interface WithResource {
    void run(Resource resource);
}

public static void withResource(WithResource handler) {
    Resource resource = new Resource();
    try {
        handler.run(resource);
    } finally {
        resource.release();
    }
}

Questo genere di cose ha più senso se stai astraendo più che provando/finalmente.Ad esempio, con JDBC puoi eseguire un'istruzione, scorrere i risultati, chiudere le risorse e racchiudere l'eccezione.

Se vuoi che il blocco using sia coinvolto nel dibattito sulla chiusura di Java: S

Mi dispiace deluderti ma a Java noi Fare usa try\catch\finally blocca molto.E con "molto", intendo MOLTO.A volte desidero che Java abbia il blocco C# using.Nella maggior parte dei casi non avrai bisogno di liberare risorse poiché il garbage collector di Java se ne occuperà.

Tuttavia le eccezioni hanno la loro utilità nel rendere la gestione degli errori molto più pulita.Puoi scrivere le tue eccezioni e catturarle per qualunque cosa tu stia facendo.Non è più necessario restituire codici di errore arbitrari all'utente!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top