Enum singleton versus non-capturing lambda

Brian Goetz brian.goetz at oracle.com
Wed Mar 13 18:40:10 PDT 2013


A more apt comparison would be the serialized form of a lambda.  Which 
is probably bigger.

But, the name-stability is a huge benefit.  While we've made some 
attempts to make the serialized form of lambdas stable across 
compilations, there are no guarantees.  Enums provide those guarantees.

On 3/13/2013 8:51 PM, Zhong Yu wrote:
> On Wed, Mar 13, 2013 at 7:09 PM, Brian Goetz <brian.goetz at oracle.com> wrote:
>> Free, compact, guaranteed-stable serialization format.
>
> It seems that the serialized format of the enum singleton is 40 bytes
> longer than a traditional singleton, if that's a concern to anyone.
>
>>
>>
>> On 3/13/2013 8:03 PM, Zhong Yu wrote:
>>>
>>> On Wed, Mar 13, 2013 at 4:51 PM, Michael Hixson
>>> <michael.hixson at gmail.com> wrote:
>>>>
>>>> I see a couple of different forms for returning functional interface
>>>> instances from static methods in the current lambda code.
>>>>
>>>> 1. Enum singleton, as in Comparators.naturalOrder()
>>>>
>>>>     private enum NaturalOrderComparator implements
>>>> Comparator<Comparable<Object>> {
>>>>       INSTANCE;
>>>>       public int compare(Comparable<Object> c1, Comparable<Object> c2) {
>>>>         return c1.compareTo(c2);
>>>>       }
>>>>     }
>>>>
>>>>     public static <T extends Comparable<? super T>> Comparator<T>
>>>> naturalOrder() {
>>>>       return (Comparator<T>) NaturalOrderComparator.INSTANCE;
>>>>     }
>>>>
>>>> 2. Non-capturing lambda, as in Functions.identity()
>>>>
>>>>     public static <T> Function<T, T> identity() {
>>>>       return t -> t;
>>>>     }
>>>>
>>>> Code complexity aside, does either approach have advantages over the
>>>> other?  Does one perform better/worse or serialize better/worse?
>>>
>>>
>>> I'd like to know too. What's the purpose of enum in the 1st example?
>>>
>>>>
>>>> -Michael
>>>>
>>>
>>


More information about the lambda-dev mailing list