Sam Wilson píše v Út 27. 04. 2010 v 18:39 -0400: > On Tue, 2010-04-27 at 19:42 +0200, Jiří Zárevúcky wrote: > > Jonh Wendell píše v Út 27. 04. 2010 v 10:46 -0300: > > > Hi, folks. I wrote a simple singleton: > > > > > > And in the other file, I do: > > > > > > var prefs = Prefs.default (); > > > .... use prefs var... > > > > > > The prefs var doesn't get destroyed, thus my destructor is never called. > > > > > > [...] > > > It refs the result variable before return. So, there's always a valid > > > object outside... > > > > > > How to handle that? > > > > > > Thanks, > > > > From you description I don't quite understand what you want it to do, > > but I'll assume you want the object freed when all external references > > are destroyed. > > For everyone's reference, a singleton is an object that exists for the > lifetime of an application, of which there is only one instance ever. >
I think that's a matter of interpretation. Sometimes you may need an
object which has at most one instance, not always exactly one. Whether
you call it a singleton or not is a stupid discussion.
> I propose the following code, it seems to work and it calls the
> destructor.
>
> The only questionable part is that vala doesn't unref namespace scoped
> variables when the program terminates, so you have to do that manually.
>
> public class Singleton<G>
> {
> public G instance {get; private set; }
>
> public Singleton(owned G instance)
> {
> _instance = (owned) instance;
> }
> }
>
> public class Prefs
> {
> internal Prefs ()
> {
> stdout.printf ("constructor\n");
> }
>
> public void do_something()
> {
> stdout.printf("Doing something...\n");
> }
>
> ~Prefs ()
> {
> stdout.printf ("destruction\n");
> }
> }
>
> Singleton<Prefs> preferences;
>
> public static void main (string[] args)
> {
> preferences = new Singleton<Prefs>(new Prefs());
>
> preferences.instance.do_something();
> preferences.unref();
> }
>
What's the point of this code? The Singleton class is redundant, you can
do exactly the same just by storing a single instance of Prefs in a
global variable. That's not a singleton.
Note: you should use preferences = null, rather than unref()
signature.asc
Description: Toto je digitálně podepsaná část zprávy
_______________________________________________ vala-list mailing list [email protected] http://mail.gnome.org/mailman/listinfo/vala-list
