Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Referencing an enclosing instance from an inner class

Tags:

java

This is a knowledge/curiosity question only.

After several years in Java, this has only just struck me.

class Foo {

   class Bar{

      Foo.this.doSomething();

   }

}

When I look at Foo.this, I would assume that it's a static reference which obviously is not the case.

I know this is part of the Java spec, but exactly what is going on when you use <Class>.this?

Is it one of those "it just is" things?

like image 985
Simon Avatar asked Jan 14 '23 16:01

Simon


1 Answers

I know this is part of the Java spec, but exactly what is going on when you use .this?

It just refers to a "hidden" field within Bar. It's easiest to see this by decompiling. You'll see that there's a Bar constructor taking a reference to an instance of Foo. That reference is stored in a field, and then when you use Foo.this, it just accesses that field. So assuming you'd put your Foo.this.doSomething() into a someMethod call, your code is similar to:

class Foo {

   static class Bar {
      private final Foo $foo;

      Bar(Foo foo) {
          this.$foo = foo;
      }    

      public void someMethod() {
          $foo.doSomething();
      }
   }
}
like image 103
Jon Skeet Avatar answered Jan 21 '23 11:01

Jon Skeet