On 17/02/2013 22:25, Jonathan M Davis wrote:
On Sunday, February 17, 2013 23:00:19 Michael wrote:
That's not the meaning of static in that context.

As I understand a static class can't be instantiated.

I have no idea how you came to that conclusion.

In fairness, it is the natural guess you'd make if you haven't actively used nested instance classes and understood how the outer instance pointer is stored. We use Java at work (same mechanism as D), and hardly anyone actually knows to write 'static' when they create a nested class that they intend to be POD. :)

That's not what it means for a
class to be static at all. The only place that static has any effect on classes
is for nested classes. A static, nested class is like any other class except
that it's inside another class, which affects its path. e.g.

module b;

class C
{
     static class W
    {
    }
}

W is therefore b.C.W, whereas if it were not nested inside of C but next to it
within the same module, then it would be b.W.

However, non-static nested classes are associated with an instance of the
outer class, and therefore only one can exist per class instance.

That's not true, is it? You can make as many nested instances as you like. It's just that there must be some outer instance available at the time of construction (which can be a new one each time or the same one every time or anything in between).

However, it
also has access to that outer class instance through the property outer. e.g.

class C
{
     class R
     {
         void func()
         {
             //Sets the variable in the instance of
             //C that it's associated with.
             outer.i = 7;
         }
     }

     int i;
}

Is it possible to write someInstanceOfR.outer? I've occasionally wanted Java to have that feature, and ended up storing the 'outer' reference manually. Though this probably means I was writing bad code; I can't remember. :D

Reply via email to