I'm with Remi on this. Sent from my MacBook Wheel
> On Nov 18, 2017, at 5:41 AM, Remi Forax <fo...@univ-mlv.fr> wrote: > > Hi John, > i strongly believe that static fluent methods have no place in a blue collar > language, we can do better, in fact the have already done better by > introducing default method instead of extension methods like in C# or Kotlin*. > > The main issue with this kind of method is that it quacks like a duck but > it's not a duck, i.e. you call those static methods as virtual methods but > there are no virtual methods because you can not override them. > > Adding extension methods as feature is like a black hole, extension methods > allow you to write clunky DSLs so it's a feature that will force the language > to move to add more new features to be able to write decent DSLs (think > implicit object as an example), and so on. So it sucks your design budget > like a black hole. > > In term of performance, the code inside a static extension methods tends to > become megamorphic, in C#, Data Link (Link for Collection API) is slow > because of that, in Kotlin you can workaround that by using the keyword > inline which will copy the code into the callsite avoiding profile pollution. > > So in my opinion, the only possible option is to introduce final default > methods, i fully understand that this is non trivial to introduce this kind > of methods in the VM but this discussion is a good use case for their > introduction. > > regards, > Rémi > > * i will not criticize Kotlin designers on that, they wanted to enhance Java > APIs without owning them so they had little options. > > ----- Mail original ----- >> De: "John Rose" <john.r.r...@oracle.com> >> À: "Patrick Reinhart" <patr...@reini.net> >> Cc: "core-libs-dev" <core-libs-dev@openjdk.java.net> >> Envoyé: Samedi 18 Novembre 2017 07:40:05 >> Objet: Re: RFR(m): 8177290 add copy factory methods for unmodifiable List, >> Set, Map > >>> On Nov 3, 2017, at 1:26 AM, Patrick Reinhart <patr...@reini.net> wrote: >>> >>>> >>>>> On 11/1/2017 4:29 PM, Patrick Reinhart wrote: >>>>> In this case I would prefer a non static copyOf() method on the list >>>>> to create a unmodifiable list/set/map, where the optimal factory >>>>> method can be called. This would also solve the problem of a >>>>> concurrent implementation. >> >> Such methods would, unfortunately, be a disastrous mistake. >> >> We are encouraging users to rely on the unmodifiability of the >> value-based lists, sets, and maps returned by copyOf, the >> same way they rely on the unmodifiability of Strings. But >> if we made copyOf be non-static, then an attacker (or just >> a buggy program) could introduce a broken implementation >> of List that returned a time-varying List. This would break >> the contract of copyOf, but it would be impossible to detect. >> The result would be a less reliable copyOf API, and >> eventually some TOCTTOU security vulnerabilities. >> This kind of surprise mutability is red meat for security >> researchers. >> >> So it's got to be a static method, although if List were a >> class we could also choose to make copyOf be a final method. >> >> I said "unfortunately" above because I too would prefer >> fluent syntax like ls.unmodifiableCopy() or ls.frozen() >> instead of List.copyOf(ls), since fluent syntax reads >> and composes cleanly from left to right. >> >> I think a good way to get what we want may be to >> introduce a way for selected methods of an interface >> to mark themselves (somehow) as "fluent statics", >> meaning that they can be invoked with their first >> argument in receiver position, before the dot. >> In effect, they would act like "final default" methods >> but without having to damage interfaces with final >> methods. >> >> I don't have a syntax in mind for defining a "fluent >> static", but I have thought for some time that allowing >> such sugar for interface statics is the best way to >> adapt the notion of class final methods to interfaces. >> >> This is not easy to do, since it is a language change, >> and only applies to a small (though influential) number of >> methods, those which should *not* be overridable but >> *should* (for some reason of API design) support virtual >> (fluent, postfix, left-to-right) notation. >> >> For more details please see JDK-8191530 and if you >> think of a good use case for these thingies, let me know >> so I can add it to the write-up. >> >> — John