Finalize()

di il
10 risposte

Finalize()

Ho appena iniziato a studiare Java e nel libro che sto seguendo trovo questa o metodo:

protected void finalize()
{
}
senza istruzioni, purtroppo l'autore del libro lo ha spiegato in maniera molto veloce e non sono riuscito a capire a cosa serve, qualcuno riuscirebbe a spiegarmelo in maniera semplice?

10 Risposte

  • Re: Finalize()

    Probabilmente ti stai riferendo ad android, nel qual caso il metodo finalize è utilizzato per richiedere la terminazione di un'activity!
  • Re: Finalize()

    No, di android il libro ancora non ne ha mai parlato.. per farti capire meglio ti posto il listato di esempio:
    public class Rectangle implements TwoDShape
    {
    	protected int width;
    	protected int heigth;
    	protected Point2D upperLeftCoords;
    	public Rectangle()
    	{
    		width=heigth=1;
    		upperLeftCoords=new Point2D(0,0);
    	}
    	public Rectangle(Point2D upperLeftCoords,int width,int heigth)
    	{
    		this.upperLeftCoords=upperLeftCoords;
    		this.heigth=heigth;
    		this.width=width;
    	}
    	protected void finalize(){}
    	public int getWidth(){return width;}
    	public int getHeigth(){return heigth;}
    	public Point2D getCoords(){return upperLeftCoords;}
    	public int area(){return width*heigth;}
    	public  int perimeter(){return (width+heigth)*2;}
    	public void draw(){System.out.println("Disegno del rettangolo");}
    	public String toString()
    	{
    		return "RETTANGOLO { "+upperLeftCoords+" --> Larghezza: "+width+", Altezza: "+heigth+" }";
    	}
    	
    }
  • Re: Finalize()

    No ti ho parlato di android perché anche li esiste un metodo simile.
    Nel tuo caso essendo la funzione vuota e mancando la documentazione non si può sapere cosa faccia. Tanto più che il nome di tale funzione non riesco a collegarlo con una "figura 2D" (cosa significa finalizzare una figura?). Quindi se il tuo libro non ti da tante spiegazioni allora può darsi che magari la spieghi (e implementi) più avanti.. L'autore cosa dice a riguardo?
  • Re: Finalize()

    L'autore dice che questo metodo è facoltativo e ha lo scopo di (testuali parole) "eseguire operazioni d finalizzazione (per esempio la chiusura di una risorsa di sistema utilizzata) prima che l'oggetto venga distrutto dal Garbage Collector)"
    non dice altro, è tratto dal libro di Pellegrino Principe "Java 7 Guida completa" Apogeo
  • Re: Finalize()

    Ti chiedo scusa, non ero a conoscenza di questo metodo. Effettivamente esso viene chiamato sul tuo oggetto quando il garbage collector decide di eliminarlo. Secondo la dovrebbe essere usato con lo scopo di "ripulire l'oggetto".
    Se lo lasci vuoto, come nel tuo caso, l'oggetto viene eliminato normalmente senza compiere altre azioni!
  • Re: Finalize()

    Beh, immagino sa impossibile conoscere tutti i metodi esistenti comunque scusami ma non mi è ancora chiarissimo, elimina l'oggetto Rettangolo dalla meoria, quello che non capisco è quando e perchè si usa questo metodo dato che, da quel che ho capito io lo dovrebbe fare direttamente il Garbage Collector, no?
  • Re: Finalize()

    Si, in realtà non sei tu a chiamare direttamente questo metodo, ma è il garbage collector che lo chiamerà quando deciderà di eliminare l'oggetto. Quello che puoi fare è ridefinire tale metodo (tramite override) per fare in modo che tale metodo (di norma vuoto, quindi identico a ciò che compare nel tuo esempio) esegua una qualche operazione, come ad esempio effettuare la pulizia delle risorse dell'oggetto stesso (ad esempio se hai a che fare con un protocollo di comunicazione invii quei pacchetti dati che causano la chiusura della connessione). Sinceramente comunque non l'ho mai utilizzato né ho mai visto esempi che lo utilizzassero; immagino, infatti, che il tuo libro abbia fornito qualche cenno giusto per renderti consapevole del fatto che tale metodo esiste, per cui se in futuro ti capiterà di trovarlo allora saprai a cosa serve
  • Re: Finalize()

    Grazie, chiarissimo
  • Re: Finalize()

    Della ha scritto:


    Si, in realtà non sei tu a chiamare direttamente questo metodo, ma è il garbage collector che lo chiamerà quando deciderà di eliminare l'oggetto. Quello che puoi fare è ridefinire tale metodo (tramite override) per fare in modo che tale metodo (di norma vuoto, quindi identico a ciò che compare nel tuo esempio) esegua una qualche operazione, come ad esempio effettuare la pulizia delle risorse dell'oggetto stesso (ad esempio se hai a che fare con un protocollo di comunicazione invii quei pacchetti dati che causano la chiusura della connessione). Sinceramente comunque non l'ho mai utilizzato né ho mai visto esempi che lo utilizzassero; immagino, infatti, che il tuo libro abbia fornito qualche cenno giusto per renderti consapevole del fatto che tale metodo esiste, per cui se in futuro ti capiterà di trovarlo allora saprai a cosa serve
    Lo si usa sempre(o lo si dovrebbe usare sempre) quando si ha a che fare con i flussi, quindi file, immagini, pacchetti udp/tcp, insomma con tutto ciò che potrebbe lasciare handler di sistema aperti.
  • Re: Finalize()

    Dato che di solito tutte le classi di stream o di connessione possono lanciare delle eccezioni, io chiudo sempre tutto nella clausola finally, per cui sono sempre sicuro di chiudere tutte le risorse quando non mi servono più.
    Tanto più che non c'è alcuna certezza sul "quando viene chiamato il garbage collector"; addirittura potrebbe non essere mai chiamato in alcuni casi, per cui c'è il rischio che "finalize" non sia mai chiamato oppure venga eseguito con parecchio ritardo rispetto al momento in cui l'oggetto può essere eliminato, con conseguente probabilità di memory leak.
Devi accedere o registrarti per scrivere nel forum
10 risposte