Singleton in Action?

Alex sascha.orlov at
Mon Feb 4 10:58:31 UTC 2019

On Monday, 4 February 2019 at 10:36:49 UTC, Ron Tarrant wrote:
> On Sunday, 3 February 2019 at 18:53:10 UTC, Jacob Carlborg 
> wrote:
>> You don't need to make it so complicated. Here's a simpler 
>> example:
> Excellent. Thank you. Simple is best.
>>     private __gshared auto instance_ = new DSingleton;
> My understanding is that in D, this line effectively says: the 
> singleton is created at compile time and can't be changed, 
> ever. Is that a fair assessment?

No, it can.

class DSingleton
     private __gshared auto instance_ = new DSingleton;
     size_t state;
     private this(){} // private to make sure no one else can 
create an instance
     static DSingleton instance() { return instance_; }

void main()
     assert(DSingleton.instance.state == 0);
     DSingleton.instance.state = 5;
     assert(DSingleton.instance.state == 5);

>>     private this() // private to make sure no one else can 
>> create an instance
> I've seen comments similar to this in several examples. When 
> you say "no one else" you're personifying callers?

To some extent...

> And so this means: No caller outside the object? Which really 
> amounts to: Since no one INside the object WILL call this() and 
> no one OUTside CAN call this(), it won't ever get called.

I think, what is meant is: The class has to be placed alone in a 
module so that no one outside the class (and the module) has any 
direct access to object creation routine.

>>     writeln(DSingleton.instance);
> No '()' needed for the call to DSingleton.instance?
> If it's called again from somewhere else, say from within an 
> object function several levels of scope away, it's called the 
> same way?


More information about the Digitalmars-d-learn mailing list