PDA

View Full Version : [Java] Istanza di classe con visibilità globale?


Killian
22-09-2005, 13:48
c'è un modo in Java per rendere un'istanza di classe globalmente visibile?

Mi spiego con un esempio:

Un metodo di un'istanza della classe alfa istanzia un'entità della classe beta, a questo punto, è possibile rendere visibile l'istanza della classe beta anche all'esterno di alfa?
Se è possibile lo è fino a che l'istanza di alfa esiste oppure quando alfa viene
cancellata si perde anche l'istanza di beta?

Se ho un codice del genere:

{
public class alfa;

public void metodo_alfa(){
...
...
beta ist_beta = new beta();
...
...
}
}

a questo punto posso fare in modo che ist_beta sia visibile anche senza passare per l'istanza di alfa (conoscendone il nome ovviamente)?


Scusate se ho scritto malamente ma sono al lavoro (anche se il consiglio mi serve per l'università, e non posso fare prove di codice fino a sabato)

PS: ovviamente mi va bene anche un link che spieghi il tutto

fek
22-09-2005, 13:59
quando metodo_alpha() termina, l'istanza viene persa ed e' disponibile per essere eliminate dal garbage collector.

Puoi assegnare l'istanza ad un campo della classe alpha che rendi pubblico (male), o che restituisci attraverso un metodo d'accesso (meglio).

Non e' chiaro che cosa vuoi fare di preciso pero'.

Angus
22-09-2005, 17:58
c'è un modo in Java per rendere un'istanza di classe globalmente visibile?

Mi spiego con un esempio:

Un metodo di un'istanza della classe alfa istanzia un'entità della classe beta, a questo punto, è possibile rendere visibile l'istanza della classe beta anche all'esterno di alfa?
Se è possibile lo è fino a che l'istanza di alfa esiste oppure quando alfa viene
cancellata si perde anche l'istanza di beta?

Se ho un codice del genere:

{
public class alfa;

public void metodo_alfa(){
...
...
beta ist_beta = new beta();
...
...
}
}

a questo punto posso fare in modo che ist_beta sia visibile anche senza passare per l'istanza di alfa (conoscendone il nome ovviamente)?


Scusate se ho scritto malamente ma sono al lavoro (anche se il consiglio mi serve per l'università, e non posso fare prove di codice fino a sabato)

PS: ovviamente mi va bene anche un link che spieghi il tutto

In soldoni, tutte le istanze (tranne casi particolari) rimangono in memoria e accessibili finchè esiste almeno un riferimento ad esse. L'istanza alfa non è proprietaria dell'istanza beta, ma di un suo riferimento, che può rendere pubblico o passare ad altre classi invocandone un metodo che accetta un parametro di quel tipo. Quando il metodo di alfa finisce si perde solo il riferimento a beta.

71104
22-09-2005, 20:10
è il concetto del reference counting (sicuramente la JVM è implementata così).
come ti è stato detto, l'oggetto viene "distrutto" (cioè entra nella garbage collection) quando il reference count scende a 0: significa che non hai più la possibilità materiale di accedere a quell'oggetto perché non hai più nessun puntatore ad esso, quindi giustamente viene eliminato; per evitare di eliminarlo basta che ne conservi un puntatore da qualsiasi parte, puoi anche copiarlo all'esterno della classe alfa.

anx721
22-09-2005, 20:18
puoi impostare un campo static su tale oggetto, in questo modo sarà sempre accessibile, senza entrare nel merito dell'opportunità do una simile soluzione, ma non sapendo lo scenario in cui ti serve è difficile proporti altre soluzioni valide

Killian
22-09-2005, 20:30
a questo punto come posso "diffondere" un puntatore all'istanza di oggetto che mi interessa preservare? Può essere un'idea prevedere un metodo pubblico (nella classe alfa seguendo l'esempio iniziale) che come output abbia proprio quell'istanza?

Conosco l'attributo static, ma nel mio caso non va bene (devo poter conservare più istanze della stessa classe, con l'attributo static non posso farlo)

Il perchè mi serva è lunghetto da spiegare.

theClimber
24-09-2005, 08:55
è il concetto del reference counting (sicuramente la JVM è implementata così).


In effetti ....NO ;) il problema del reference counting e' che insiemi isolati di oggetii non piu' usati ma con referenze cicliche interne al loro stesso insieme non possono essere individuati.

La strategia di base del GC di java e' la mark & sweep, ovvero il GC segue le reference a partire da punti di accesso noti per markare le classi usate. Le classi non markate sono quelle da rimuovere.

Dai un occhio per approfondire alcuni punti piu' complessi :
http://www.cs.usfca.edu/~parrt/course/652/lectures/gc.pdf

Ciao
Ciao

theClimber
24-09-2005, 09:01
Dall'articolo precedente:

Imagine walking to the refrigerator and getting out a bowl of grapes. You pick up the bunch by the stem and look in the bottom of the bowl; there are a bunch of black and blue moldy grapes--that's the "garbage".

Traduzione: la GC funziona come un grappolo d'uva, lo raccogli, e gli acini non collegati che cadono sono gli oggetti morti.

Bella metafora.... :D

71104
24-09-2005, 12:10
già, hai ragione; il problema è che bisogna contare solamente i reference da parte di thread ancora funzionanti: se un oggetto ha un reference all'istanza di un altro oggetto, ma nessun thread usa quei due oggetti, allora sono inutili. però non mi interessa più di tanto :p

cionci
24-09-2005, 13:20
Potresti usare un singleton !!!

http://www.javacoffeebreak.com/articles/designpatterns/