Java 7: tijd voor verse koffie

17 March 2009 11:47 Martin Sturm Algemeen, Java

Hoewel Java al een flink aantal jaren meegaat, wordt er toch nog steeds aan gewerkt om de taal te verbeteren zodat deze ook in de toekomst nog bruikbaar is. Java 6 is inmiddels ruim twee jaar geleden uitgebracht en begint dus een beetje ouwe koffie te worden. De meeste mensen geven voorkeur aan verse koffie, dus daarom werkt een groot aantal ontwikkelaars al aan Java 7, die we in maart 2010 kunnen verwachten. In dit artikel zal ik proberen een overzicht te geven over de huidige stand van zaken en wat we zoal in Java 7 kunnen verwachten.

Grote veranderingen

Hoewel het nog niet zeker is wat er uiteindelijk precies in Java 7 zal komen, zijn er al wel een aantal grote veranderingen waarvan het zeker is dat die in JDK7 terug te vinden zullen zijn. De belangrijkste is de modularisatie van de JDK. Dit project, dat nu nog door het leven gaat onder de naam Project Jigsaw, heeft als doel om het platform flexibeler te maken en bovendien de distributie van Java-applicaties en -bibliotheken te vereenvoudigen. Samengevat komt het idee er op neer dat Java syntax-ondersteuning krijgt om modules te kunnen laden (JSR294) en dat de Java-libraries als losse modules gedistribueerd kunnen worden. Een module is dus een groepering van Java-packages op taalniveau en jar-files op bestandsniveau. Java-modules zullen dynamisch geladen kunnen worden – vergelijkbaar met hoe OSGi werkt – en het is mogelijk om afhankelijkheden te specificeren tussen modules, waarbij een afhankelijkheid ook optioneel kan zijn. Een nieuw access-level voor classes en interfaces – in de draft aangeduid met het keyword ‘module’ – moet er voor zorgen dat een class of interface alleen toegankelijk is voor andere classes binnen dezelfde module.

JigsawDe grootste voordelen van de modularisatie zal zijn dat er minder problemen zullen ontstaan met dependencies tussen diverse bibliotheken, omdat het mogelijk is meerdere versies van eenzelfde module in één project te gebruiken. Bovendien zal dus ook de JDK zelf worden gemodulariseerd. Dit heeft als direct voordeel dat niet meer de complete verzameling Java-bibliotheken hoeft te worden geïnstalleerd, waardoor de kern van de JDK aanzienlijk kleiner zal worden. Onderdelen van Java die eigenlijk niet meer gebruikt worden zullen makkelijker uitgefaseerd kunnen worden, maar ook zal het eenvoudiger worden om nieuwe onderdelen aan de JDK toe te voegen, zo claimen de bedenkers van het geheel.

De modularisatie van Java is een ingrijpende aangelegenheid. Het vereist aanpassingen aan de Java-syntax, de core libraries en de Java-compiler. Sun Microsystems heeft het op zich genomen om deze aanpassingen uit te voeren, maar heeft daar wel het gevolg aan gekoppeld dat er geen andere ingrijpende aanpassingen plaats zullen vinden op taalniveau. Slachtoffers hiervan zijn closures en ondersteuning voor property fields – zoals bijvoorbeeld wel in C# is terug te vinden.

Een aantal andere vernieuwingen die vrijwel zeker in JDK7 terug te vinden zullen zijn, betreffen onder andere de NIO2-bibliotheek. NIO2 gebruikt besturingssysteemspecifieke code om toegang tot bestanden, directories en netwerkbronnen te verschaffen, waardoor diverse snelheidsverbeteringen gerealiseerd zullen worden. Een van de belangrijke features die NIO2 biedt is asynchrone toegang tot (metadata van) bestanden, zodat het bijvoorbeeld mogelijk is om code te triggeren zodra een bestand wordt aangepast zonder dat hiervoor om de zoveel tijd hoeft te worden gecheckt of het bestand is veranderd. Ook zullen er weer verbeteringen in concurrency-features worden doorgevoerd, zullen de standaard bibliotheken worden verbeterd en zal er een update van Swing plaatsvinden, waaronder een nieuw media-component waarmee het eenvoudig wordt om video’s op te nemen in een Swing-applicatie (vermoedelijk vergelijkbaar met de media-features uit JavaFX).

JVM-aanpassingen

Een andere grote aanpassing die er zeker in zal komen is de zogenaamde ‘invokedynamic’ feature. Dit is geen aanpassing van de Java-programmeertaal, maar heeft uitsluitend betrekking op de Java Virtual Machine. Invokedynamic heeft vooral voordelen voor dynamische (script)talen zoals JRuby, Jython, Scala, Clojure, Groovy, JavaFX en Fan. Een complete uitleg van deze feature vereist een artikel op zich, maar het komt er op neer dat het onder andere sneller wordt om individuele methods uit te voeren. Dit is vooral relevant voor talen die closures ondersteunen of die mogelijkheden bieden om methods aan een object toe te voegen nadat er een instantie van dat object is aangemaakt.

Inmiddels is in de huidige ontwikkelversie van de JVM de garbagecollector vervangen door een nieuwe. Deze vernieuwde garbagecollector zou betere performance met zich meebrengen, maar vooral beter voorspelbaar zijn in vergelijking met de garbagecollector in JDK6.

Project Coin

Er is uiteraard nog heel veel tekst te schrijven over nieuwe features die mogelijk in Java 7 komen, maar helaas is de ruimte hier beperkt. Eén ding wil ik echter nog wel noemen, en dat is Project Coin. Ondanks dat er niet veel grote aanpassingen aan de Java-programmeertaal zelf worden doorgevoerd, wilden de ontwikkelaars met deze nieuwe release niet de kans voorbij laten gaan om eenvoudige aanpassingen in de taal door te voeren die de productiviteit van ontwikkelaars ten goede komen. Een voorbeeld van zo’n feature uit het verleden is de foreach-constructie die in Java 5 is toegevoegd.

CoinIedereen die een goed idee heeft kan nu een voorstel doen voor zo’n ‘eenvoudige’ verbetering voor Java 7 door dit in te dienen op de daarvoor bedoelde mailinglijst. Het voorstel moet volgens een bepaalde standaard worden opgesteld en dient uiterlijk voor 30 maart 2009 te zijn ingediend. Op dit moment zijn er ongeveer 21 voorstellen ingediend. Van een aantal wordt wel aangenomen dat deze uiteindelijk zullen worden geïmplementeerd:

  • De mogelijkheid om Strings te gebruiken in switch-statements.
  • Verbeterde type inference voor Generics, waardoor het bijvoorbeeld mogelijk zal worden om het volgende schrijven:
    Map<String, List<String>> myMap = new HashMap<>();
    Het is dus niet meer nodig om twee keer de types te definieren, en bespaart de ontwikkelaar dus typewerk zonder dat het ten koste gaat van de leesbaarheid.
  • De ‘elvis’-operator en andere operators die een test op het null-zijn van een variabele overbodig maken. De Elvis operator (in het voorstel .? ) is bijvoorbeeld bekend uit Groovy (waar het ?. is) en checkt dus of een object-reference null is bij het dereferencen. Voorbeeld:

    MyObject myInstance = getMyInstance();
    myInstance.?toString();
    Nu moet de aanroep van myInstance.toString() vooraf moeten worden gegaan door een check op null voor myInstance om een NullPointerException te voorkomen.
  • Verbeterde exception afhandeling, waarbij het onder andere mogelijk zal zijn om meerdere exception-types in een enkele catch af te vangen en het opnieuw ‘throwen’ van een exception waarbij de oorspronkelijke inhoud van de exception behouden blijft.

Er zijn nog een aantal andere interessante en minder interessante voorstellen en er zullen er zeker nog bijkomen, maar bovenstaand lijstje geeft hopelijk een indicatie van wat voor veranderingen we op taalgebied kunnen verwachten in JDK7. Het is voor ontwikkelaars die geïnteresseerd zijn in ontwikkeling van de Java-taal zeker de moeite om eens de eerder genoemde Project Coin-mailinglijst te bekijken, aangezien er interessante discussies plaatsvinden over de voorgestelde features en de soms verassende consequenties die een kleine verandering teweeg kan brengen.

Conclusie

Ook al zal het nog zeker een jaar duren voordat Java 7 definitief beschikbaar zal zijn, toch begint zich langzaam maar zeker af te tekenen wat we in de komende release kunnen verwachten. Uiteraard zullen er nog dingen veranderen en zijn de beschreven features nog lang niet definitief. Toch kunnen we voorzichtig concluderen dat er een aantal welkome verbeteringen aan zitten te komen, die niet alleen voor Java-ontwikkelaars interessant zijn, maar zeker ook voor ontwikkelaars die alternatieve programmeertalen gebruiken die op de JVM draaien.

Een belangrijke verschil ten opzichte van vorige releases is dat de ontwikkeling van Java 7 volledig in de openheid plaatsvindt onder de noemer van het OpenJDK-project. Het is dus ook al mogelijk om nu te kijken wat de stand van zaken is door OpenJDK te downloaden en de nieuwe features uit te proberen.

Reageer

RSS feed for comments on this post · TrackBack URI