JEP 301: Enhanced Enums

John Rose john.r.rose at oracle.com
Thu Dec 8 23:01:18 UTC 2016


True.  The use case I have in mind identifies the ops as intrinsics. The enum index ties to code generation tables. 

– John

> On Dec 8, 2016, at 2:36 PM, forax at univ-mlv.fr wrote:
> 
> ----- Mail original -----
>> De: "John Rose" <john.r.rose at oracle.com>
>> À: forax at univ-mlv.fr
>> Cc: "Maurizio Cimadamore" <maurizio.cimadamore at oracle.com>, platform-jep-discuss at openjdk.java.net
>> Envoyé: Jeudi 8 Décembre 2016 22:12:14
>> Objet: Re: JEP 301: Enhanced Enums
> 
>>> On Dec 7, 2016, at 11:23 PM, forax at univ-mlv.fr wrote:
>>> 
>>> Name functions are not useful anymore, because now we have full real lambdas.
>> 
>> There is still a big place for named function enums. Lambdas let you say "here
>> is a plus operator" but not "here is the plus operator which is abelian with
>> unit 0". Enums can fill that gap, for now.
> 
> you mean something like:
>  interface Group<T> {
>    BinaryOperator<T> binOp();
>    T identity();
>    boolean is(Characteritics characteristics);
>    ..
>  }
> 
>  enum Op<T> implements Group<T> {
>    PLUS<Integer>(Integer::sum, 0, Characteritics.ABELIAN)
>    ;
>    ...
>  }
> 
>  public static <T> Optional<T> reduce(List<? extends T>list, Group<T> group) {
>    if (group.is(Characteritics.ABELIAN) && list.size() > ...) {
>      return Optional.of(parallelReduce(list, group.identity(), group.binOp())); 
>    }
>    return foldLeft(list, group.binOp());
>  }
>  ...
>  reduce(List.of(1, 2, ...), Op.PLUS);
> 
> 
> but you can simply write
> 
> static class Op<T> implements Group<T> {
>  public static final Group<Integer> PLUS = new Op(Integer::sum, 0, Characteritics.ABELIAN);
>  ...
> }  
> 
>> 
>> – John
> 
> Rémi



More information about the platform-jep-discuss mailing list