mboost-dp1

Sun

Kritik af implementation af closures i Java

- Via Version2 - , redigeret af Net_Srak , indsendt af arne_v

I december sidste år blev det klart, at Java version 7 vil implementere closures, og i den forbindelse oplyste Mark Reinhold, at man hos Sun (Oracle) ikke ville vælge et af de tre forslag til implementation, der var fremme, men udvikle en ny.

Det er nu blevet til, at closures skal benyttes i Java via den såkaldte “Strawman-syntaks”, der er ifølge Version2 er valgt på baggrund af et kommende parallelisme-bibliotek, idet operationer så kan afvikles på flere processorkerner samtidig.

Valget er dog allerede kommet under kritik, blandt andet fra danske David Heinemeier Hansson, der opfandt Rails, som mener, syntaksen er alt for støjfyldt.

Kritikken følger i kølvandet på de mange års debat, der har været hidtil, om hvordan closures bør implementeres i Java.





Gå til bund
Gravatar #51 - Windcape
22. jun. 2010 15:31
#50

Det virker overordnet meget som en løsning der i Java findes fordi den har dårlig type inference.

f.eks. følgende


void shuffle(List<?> list) { ... }


I C# kan vi skrive det således


void Shuffle<T>(List<T> list) { ... }


Effiktivt set tillader begge sprog så et kald til shuffle(...) uden at explicit angive typen.

Så rent pratisk, er der ingen forskel, udover at det er mere komplekst i Java.
Gravatar #52 - Windcape
22. jun. 2010 15:33
Noget helt andet, bliver collections samlet som en underliggende type i Java 7, eller skal man resolut skrive overloads til både arrays, lists og sets for at kunne supportere lambda-selectors?

Jeg havde hørt et eller andet om en java.collections
Gravatar #53 - arne_v
23. jun. 2010 02:01
Windcape (1) skrev:
Det var da godt nok en afskyelig syntaks. Hvorfor er det at JCP ikke bare har valgt at dublikere C#?


Det har de vel stort set også?

Så vidt jeg kan se er den eneste forskel de tokens der bruges til at markere hvad det er.

#(x,y)(x+y)

fremfor

(x,y) => x+y

Gravatar #54 - arne_v
23. jun. 2010 02:06
onetreehell (4) skrev:


Collections.sort(data, #(String a, String b) { CountingSorter.this.count++; return a.length()-b.length(); });
});



Windcape (7) skrev:
Din kode kan skrives så simpelt her i C#:


int count = 0;
var sorted = data.OrderBy(x => { count++; return x.Length; })



Suk.

Hvis du kiggede lidt på koden, så ville du opdage at forskellen skyldes at Collection.Sort og IEnumerable.OrderBy har et forskelligt API ikke p.g.a. forskellen i closures/lambda.

Du kunne godt lave IEnumerable.OrderBy API'et med det foreslåede Java closures.
Gravatar #55 - arne_v
23. jun. 2010 02:09
Windcape (21) skrev:
Dvs. du mener ikke Microsoft har gjort det fornuftigt i C#, eller mener du at det ikke er muligt i Java uden at omskrive hele deres implementing af Generics?


Han siger vist at han ikke tror at det kan implementeres i Java uden at reducere funktionaliteten af Java generics.
Gravatar #56 - arne_v
23. jun. 2010 02:15
krainert (30) skrev:
Vi kan vist hurtigt blive enige om, at den praktiske implementation af generics i Java er fejlbarlig, men arbejdsbyrden i fuldstændigt at omskrive JVM (eller hvad ellers måtte være nødvendigt for at opnå den ideelle understøttelse) er formentligt for stor til at vurderes ønskelig at gennemføre.


Ændringerne i JVM kunne man nu nok leve med.

Men man ville enten breake en masse eksisterende kode eller gøre det meget lidt brugt.
Gravatar #57 - arne_v
23. jun. 2010 02:29
Windcape (39) skrev:

Derudover så ved compileren godt hvilken type et dynamisk variabel har.


Nej. Det er hele pointen med dynamic.

Windcape (39) skrev:

dynamic test = "foo";
typeof(test) // System.String
test = 42;
typeof(test) // System.Int32


Hvilket ikke er valid C# kode.
Gravatar #58 - arne_v
23. jun. 2010 02:35
Windcape (47) skrev:
Altså du kan også skrive det sådan her:


ICollection<object> c = new List<string>();


Men jeg forstår stadigvæk ikke hvad du får ud af det?


Det kan være meget svært at følge en debat om sprog syntax når der postes eksempler som ikke compiler.

Gravatar #59 - arne_v
23. jun. 2010 02:37
Windcape (51) skrev:
#50

Det virker overordnet meget som en løsning der i Java findes fordi den har dårlig type inference.

f.eks. følgende


void shuffle(List<?> list) { ... }


I C# kan vi skrive det således


void Shuffle<T>(List<T> list) { ... }



Nej.

Den C# kode svarer til Java koden:


<T> void shuffle(ArrayList<T> list) { ... }

Gravatar #60 - Windcape
23. jun. 2010 14:24
arne_v (53) skrev:
Så vidt jeg kan se er den eneste forskel de tokens der bruges til at markere hvad det er.
Og at straw-man syntaksen kræver type-angivelse på de enkelte parametre!
Gravatar #61 - arne_v
29. jun. 2010 00:01
#61

Ah ja. Det blev jo et hovedemne i debatten.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login