The virtual field pattern

Olexandr Demura oleksander.demura at gmail.com
Thu Aug 9 10:07:48 PDT 2012


No, its not, since VirtualSomething extends P.
So, its probably package-private interface - will not leak.

2012/8/9 Brenden Towey <brendentowey at gmail.com>:
>
> It's true that you save some typing, especially for classes with many
> methods, but one thing I don't like about this pattern is it forces your
> implementation to be public.  Other classes can call your "delegate()"
> method, and then muck about with your internal implementation.
>
> This is a good reason to allow the protected keyword for interface
> methods, in my opinion.
>
> public interface VirtualSomething {
>      protected P delegate();
>      T1 m1(...) default {
>         return delegate().m1(...);
>      }
>      T2 m2(...) default {
>          return delegate().m2(...);
>      }
> .......
> }
>
>
> On 8/9/2012 3:35 AM, Jose wrote:
>> Hi all
>>
>> This post is an elaboration of a comment by Yuval Shavit
>>
>> http://mail.openjdk.java.net/pipermail/lambda-dev/2012-July/005170.html
>>
>> After that Brian called this pattern the "virtual field pattern"
>>
>> http://mail.openjdk.java.net/pipermail/lambda-dev/2012-July/005171.html
>>
>> I didn't find any refereces to this name, but neither has nothing better to
>> offer.
>>
>> I suppose that programers used to work with Traits would find this post
>> trivial, but the pattern was a good surprisse to me because I immedially
>> could locate a bunch of places where my code would benefit form it.
>>
>> I think this pattern shows a simple case where extension methods plays and
>> important role in the design of the type hierarchy, independently of API
>> evolution.
>>
>> Lets go:
>>
>> Let P be an interface
>>
>> interface P{
>>      T1 m1(...);
>>      T1 m2(...);
>>       .........
>> }
>>
>> and CP a class implementing P:
>>
>> CP implements P{
>>      T1 m1(...){...};
>>      T1 m2(...){...};
>>       .........
>> }
>>
>> The VirtualField pattern allows you to replace the task of implementing P by
>> the task of implementing a Trait
>>
>>               VirtualP
>>
>> which extends P.
>>
>> The advantage is that VirtualP has a only a single abstract method to
>> implement, one that returns an instance of P.
>> Furthermore VirtualP must implement all methods of P by delegation:
>>
>> interface VirtualP extends P{
>>      P delegate();
>>      T1 m1(...) default {
>>          return delegate().m1(...);
>>      }
>>      T2 m2(...) default{
>>          return delegate().m2(...);
>>      }
>>      .......
>> }
>>
>> Let D be a class we want to implement P, but it can't extend CP because it
>> already extends another class.
>> To have D implementing P we only need to provide these lines of code:
>>
>> Class D implements VirtualP{
>>      P delegate=new CP();
>>      P delegate(){
>>          return delegate;
>>      }
>>      ....
>> }
>>
>> If P has many methods and you have many candidates to implement P, like in
>> my case, this pattern saves code and makes these classes more readable.
>
>


More information about the lambda-dev mailing list