Java 15

94 views
Skip to first unread message

Remi Forax

unread,
Sep 15, 2020, 11:15:59 AM9/15/20
to lescastcodeurs
Java 15 est sortie,
https://mail.openjdk.java.net/pipermail/jdk-dev/2020-September/004733.html

Coté VM
- Deux nouveaux GCs
Shenandoah et ZGC sont production ready
- des lambdas qui occupent moins de meta-space avec les Hidden Classes (Emmanuel, cela devrait corrigé le bug dont tu m'avais parlé)

Coté language
- en version final
les texts blocks (les String entre """ """ sur plusieurs lignes),
- en preview
les records (classes simplifiés comme les data classes de Kotlin et les cases classes de Scala)
par ex: record Point(int x, int y) { }
les sealed types (qui limite les sous-types possibles, pareil repompé sur Kotlin/Scala mais les sealed types sont vérifiés par la VM)
par ex: sealed interface Figure permits Rectangle, Circle { }
le instanceof qui introduit une variable,
par ex: if (object instanceof Foo foo) { ... foo.x ... }

Les 3 dernières features continue l'idée d'introduire le pattern matching en Java
(à la fin du mail, il y a un exemple de comment utiliser les records et les sealed types pour implanter FizzBuzz)


Les IOs ré-implantés:
depuis Java 12, toutes les IOs sont entrain d'être ré-implanter pour permettre l'utilisation des threads virtuelles
en vu de l'intégration du projet loom, pour cette release, c'est l'API des DatagramSocket qui y passe.


Le Biased-locking déprécié:
Lorsqu'un synchronized bloque toujours le même thread, on peut gagner un peu en vitesse, en flaggant un objet comme appartenant toujours à la même thread.
Cette optiization marchait bien avec les anciens processeur qui avait l'instruction CAS (Compare And Set) lente (pour Intel c'est pré-Nehalem je crois),
maintenant, on gagne plus vraiment grand chose et l'implantation du biased locking utilise un précieux bit dand le header des objets
qui pourrait être utiliser à autre choses. Donc cette optimization est déprécié en 15 et retirer en 16.


Nouvelle APIs:
La version 2 de l'API Foreign-Memory Access, qui permet de déclarer et manipuler la mémoire off-heap sans passer par Unsafe.
Les appels directes au fonction C arrive dans la version 16 pour une intégration "native" sans JNI.


Features supprimées:
- Nashorn, personne pour assurer la maintenance, snif :(
- Remove the Solaris and SPARC Ports, pareil.


Voilà, voilà,
Rémi


---
import static java.util.stream.IntStream.rangeClosed;

import java.util.List;

public interface RecordFizzBuzz {
sealed interface Item {
static Item create(int value) {
return Special.ALL.stream().filter(s -> value % s.divisor == 0).findFirst().<Item>map(s -> s).orElseGet(() -> new Value(value));
}
}
record Value(int value) implements Item {
@Override
public String toString() {
return "" + value;
}
}
enum Special implements Item {
FizzBuzz(15), Buzz(5), Fizz(3)
;
final int divisor;
Special(int divisor) {
this.divisor = divisor;
}
static final List<Special> ALL = List.of(values());
}

static void main(String[] args) {
rangeClosed(1, 100).mapToObj(Item::create).forEach(System.out::println);
}
}


Fred Bricon

unread,
Sep 18, 2020, 8:38:42 AM9/18/20
to lescast...@googlegroups.com
Salut Remi,

en testant le support de Java 15 dans vscode-java, je me suis rendu compte que ce code n'était pas valable:

public sealed class App permits Foo {

static final class Foo extends App {}
}

javac confirme:

javac --enable-preview --release=15 App.java                         
App.java:7: error: cannot find symbol
public sealed class App permits Foo {
                                ^
  symbol: class Foo
App.java:9: error: class is not allowed to extend sealed class: App
    static final class Foo extends App {}
                 ^
Note: App.java uses preview language features.
Note: Recompile with -Xlint:preview for details.
2 errors

ECJ et javac remontent les memes erreurs donc s'est manifestement spécifié comme ça mais, ça me semble pas intuitif comme résultat.

Tu aurais une explication rapide pour ceux qui ont juste lu la spec en diagonale?

Merci,

Fred

--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes lescastcodeurs.
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse lescastcodeur...@googlegroups.com.
Cette discussion peut être lue sur le Web à l'adresse https://groups.google.com/d/msgid/lescastcodeurs/63086933.1723204.1600182952350.JavaMail.zimbra%40u-pem.fr.


--
"Have you tried turning it off and on again" - The IT Crowd
And if that fails, then http://goo.gl/tnBgH5

Remi Forax

unread,
Sep 18, 2020, 10:13:40 AM9/18/20
to lescastcodeurs
De: "Fred Bricon" <fbr...@gmail.com>
À: "lescastcodeurs" <lescast...@googlegroups.com>
Envoyé: Vendredi 18 Septembre 2020 14:38:28
Objet: Re: [LCC] Java 15
Salut Remi,
en testant le support de Java 15 dans vscode-java, je me suis rendu compte que ce code n'était pas valable:

public sealed class App permits Foo {

static final class Foo extends App {}
}

javac confirme:

javac --enable-preview --release=15 App.java                         
App.java:7: error: cannot find symbol
public sealed class App permits Foo {
                                ^
  symbol: class Foo
App.java:9: error: class is not allowed to extend sealed class: App
    static final class Foo extends App {}
                 ^
Note: App.java uses preview language features.
Note: Recompile with -Xlint:preview for details.
2 errors

ECJ et javac remontent les memes erreurs donc s'est manifestement spécifié comme ça mais, ça me semble pas intuitif comme résultat.

Tu aurais une explication rapide pour ceux qui ont juste lu la spec en diagonale?

Salut Fred,
remplace Foo par App.Foo, son vrai nom, et cela va marcher, Foo s'appel Foo uniquement à l'intérieur de accolade, pas à l'extérieur,
je sais c'est débile, mais tu as le même problème avec extends ou implements, c'est pas que avec permits.

public sealed class App permtis App.Foo {
  static final class Foo extends App {}
}


Merci,

Fred

Rémi

Fred Bricon

unread,
Sep 18, 2020, 10:51:00 AM9/18/20
to lescast...@googlegroups.com
Bon sang mais c'est bien sur! Merci Rémi.

Purée 20 ans à faire du Java c'est pas suffisant.

Reply all
Reply to author
Forward
0 new messages