On Sun, 17 Feb 2013 18:26:37 -0500, Ben Davis <ent...@cantab.net> wrote:

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. :)

static class at module level means nothing.  It's a noop.

static class inside a class means, this class instance does not contain a pointer to it's outer class instance, nor does it have access to the outer class instance's variables (naturally).

so:

module X;

static class A {}

is exactly equivalent to

class A {}

You can make as many nested instances as you like.

Yes, as Jonathan indicated, this is possible.

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

I don't know if outer is public or private.  Quick test...

Yep, you can access it. But I don't know if that is the correct way to do it, or if that is intended. The spec does not consider that possibility.

I will note, one VERY annoying thing about outer, is that outer by itself doesn't work inside an inner class' function unless you qualify it with this:

class A
{
   int x;
   class B
   {
      void foo()
      {
         // outer.x = 5;  // Error: undefined identifier outer
         this.outer.x = 5; // ok
      }
   }
}

-Steve

Reply via email to