Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #35748

Re: Is there a better way to reference this?

From Sebastian <nowhere@nirvana.org>
Newsgroups comp.lang.java.programmer
Subject Re: Is there a better way to reference this?
Date 2016-10-11 22:08 +0200
Organization albasani.net
Message-ID <ntjgrl$oqr$1@news.albasani.net> (permalink)
References <7fd3908d-6705-4034-99ee-08e4e3a4a4c6@googlegroups.com> <ntisp7$u03$1@dont-email.me> <6f6d13d3-c131-4502-ab97-ae8043d33d26@googlegroups.com>

Show all headers | View raw


Am 11.10.2016 um 16:37 schrieb Eric Douglas:
> On Tuesday, October 11, 2016 at 10:26:10 AM UTC-4, Eric Sosman wrote:
>>      I think you're out of luck as things stand.  If you were to use a
>> named class as your JTable subclass you could get rid of `ref' and use
>> `MyTableClass.this' inside the FocusListener, but as long as the JTable
>> extension remains anonymous I don't think there's any way to qualify
>> the `this'.
>
> Ah OK, so there's that at least.
> This simple extension of the JTable was the shortest I could come up with for sample code.  So if we have MyCustomTable extends JTable then create a listener inside a method of MyCustomTable we can reference the instance of the MyCustomTable the listener is being added to with the MyCustomTable.this.  I have seen that syntax before, haven't realized a practical use for it.
>

Here's another approach: use lambdas. A lambda does not introduce a new 
scope for variable references, in particular 'this' means the same 
inside a lambda as in the surrounding context. So if your FocusListener 
were a lambda, it could reference the surrounding JTable - anonymous or 
not - by 'this'.

Now FocusListener, containing as it does two abstract methods, is not a 
functional interface. But you might define an abstract utility class 
'FocusListeners' with the following reusable factory methods:

  public static FocusListener forFocusGained(Consumer<FocusEvent> c) {
       return new FocusAdapter() {
           public void focusGained(FocusEvent e) {
               c.accept(e);
           }
       };
   }

   public static FocusListener forFocusLost(Consumer<FocusEvent> c) {
       return new FocusAdapter() {
           public void focusLost(FocusEvent e) {
               c.accept(e);
           }
       };
   }

There is one one static factory method for each FocusListener method. 
Each accepts a lambda expression as a parameter whose signature 
corresponds to that of the relevant FocusListener method and returns a 
listener instance that invokes the lambda expression.

With that, your application code becomes very concise:

   HashSet<JTable> storeTable = new HashSet<>();
   JTable myTable = new JTable() {
   {
       addFocusListener(forFocusGained(e -> storeTable.add(this)));
   }

Of course, you can make lambda-enabled MouseListeners, KeyListeners etc. 
in the same way.

This approach is due to Heinz Kabutz.

-- Sebastian

Back to comp.lang.java.programmer | Previous | Next — Previous in thread | Find similar | Unroll thread


Thread

Is there a better way to reference this? Eric Douglas <e.d.programmer@gmail.com> - 2016-10-11 06:51 -0700
  Re: Is there a better way to reference this? Eric Sosman <esosman@comcast-dot-net.invalid> - 2016-10-11 10:25 -0400
    Re: Is there a better way to reference this? Eric Douglas <e.d.programmer@gmail.com> - 2016-10-11 07:37 -0700
      Re: Is there a better way to reference this? Sebastian <nowhere@nirvana.org> - 2016-10-11 22:08 +0200

csiph-web