[Java] Puissant! 9 nouvelles fonctionnalités de Java 9

Original: http://www.javastack.cn/article/2018/nine-java-9-new-features/

Vous avez peut-être entendu parler du système de modules de Java 9, mais cette nouvelle version comporte de nombreuses autres mises à jour. Voici neuf nouvelles fonctionnalités intéressantes qui seront publiées avec Java 9.

1. Système de modules au niveau de la plate-forme Java

La fonction déterminante de Java 9 est un tout nouveau système de modules. Lorsque la base de code devient de plus en plus grande, les chances de créer un "code de style spaghetti" complexe et entrelacé augmentent de façon exponentielle. À ce stade, vous devez faire face à deux problèmes de base: il est difficile d'encapsuler vraiment le code et le système n'a pas de concept clair des dépendances entre les différentes parties (c'est-à-dire les fichiers JAR).

Chaque classe publique peut être accédée par n'importe quelle autre classe publique sous le classpath, ce qui conduira à l'utilisation par inadvertance d'API qui ne veulent pas être accessibles au public. De plus, le classpath lui-même a des problèmes: comment savoir que tous les JAR requis sont déjà là, ou y a-t-il des éléments en double? Le système de modules résout ces deux problèmes.

Les fichiers JAR modulaires contiennent un descripteur de module supplémentaire. Dans ce descripteur de module, les dépendances sur d'autres modules sont exprimées par "requiert". De plus, l'instruction "exports" contrôle les packages auxquels d'autres modules peuvent accéder. Tous les packages qui ne sont pas exportés sont encapsulés dans le module par défaut. Voici un exemple de descripteur de module, qui existe dans le fichier "module-info.java":

module blog {
  exports com.pluralsight.blog;

  requires cms;
}

Nous pouvons afficher le module comme suit:

Insérez la description de l'image ici

Veuillez noter que les deux modules contiennent des packages encapsulés car ils ne sont pas exportés (visualisés avec un bouclier orange). Personne n'utilisera accidentellement les classes de ces packages. La plate-forme Java elle-même est également modulaire à l'aide de son propre système de modules. En encapsulant les classes internes du JDK, la plate-forme est plus sûre et l'amélioration continue est plus facile.

Lors du démarrage d'une application modulaire, la JVM vérifie si tous les modules sont disponibles, sur la base de l'énoncé des exigences - un grand pas en avant par rapport au fragile classpath. Les modules vous permettent de mieux appliquer l'empaquetage structuré de votre application et en dépendent explicitement. Vous pouvez en apprendre plus sur le fonctionnement des modules dans Java 9 dans ce cours.

2 Liaison

Lorsque vous utilisez des modules avec des dépendances explicites et un JDK modulaire, de nouvelles possibilités se présentent. Votre module d'application va maintenant déclarer ses dépendances sur d'autres modules d'application et les modules JDK qu'il utilise.

Pourquoi ne pas utiliser ces informations pour créer un environnement d’exécution minimal contenant uniquement les modules nécessaires à l’exécution de l’application? Cela peut être réalisé grâce au nouvel outil jlink de Java 9. Vous pouvez créer une image d'exécution minimale optimisée pour une application sans utiliser une installation JDK entièrement chargée.

3. JShell: REPL Java interactif

De nombreux langages ont déjà des environnements de programmation interactifs et Java rejoint maintenant le club. Vous pouvez démarrer jshell à partir de la console et commencer directement à taper et à exécuter du code Java. Les commentaires immédiats de jshell en font un excellent outil pour explorer les API et tester les fonctionnalités du langage.

Insérez la description de l'image ici

Tester une expression régulière Java est un bon exemple de la façon dont jshell peut vous faciliter la vie. Le shell interactif peut également fournir un bon environnement d'enseignement et augmenter la productivité, vous pouvez en savoir plus ici. Dans le processus d'enseigner aux gens comment écrire Java, il n'est plus nécessaire d'expliquer le non-sens "public static void main (String [] args)".

4. Javadoc amélioré

Parfois, de petites choses peuvent faire une grande différence. Utilisez-vous Google comme moi pour trouver la bonne page Javadoc? Ce n'est plus nécessaire. Javadoc prend désormais en charge la recherche dans la documentation de l'API. De plus, la sortie de Javadoc est désormais conforme à la norme compatible HTML5. De plus, vous remarquerez que chaque page Javadoc contient des informations sur la source des classes ou interfaces de module JDK.

Insérez la description de l'image ici

5. Méthode d'usine de collecte

Habituellement, vous souhaitez créer une collection (par exemple, List ou Set) dans votre code et la remplir directement avec certains éléments. Pour instancier la collection, plusieurs appels "add" rendent le code répétitif. Dans Java 9, plusieurs méthodes de fabrique de collections ont été ajoutées:

Set<Integer> ints = Set.of(1, 2, 3);
List<String> strings = List.of("first", "second");

En plus d'être plus courtes et plus lisibles, ces méthodes peuvent également vous empêcher de choisir une implémentation de collection spécifique. En fait, il est hautement optimisé pour renvoyer une collection de plusieurs éléments de la méthode factory. Ceci est possible car ils sont immuables: après la création, continuer à ajouter des éléments à ces collections provoquera une "UnsupportedOperationException".

6. API Stream améliorée

Pendant longtemps, l'API Stream a été l'une des meilleures améliorations de la bibliothèque standard Java. Grâce à cet ensemble d'API, un pipeline de déclaration pour la conversion peut être établi sur la collection. Cela ira mieux dans Java 9. Quatre nouvelles méthodes ont été ajoutées à l'interface Stream: dropWhile, takeWhile, ofNullable. Il existe également une nouvelle surcharge de la méthode iterate, qui vous permet de fournir un prédicat (condition de jugement) pour spécifier quand terminer l'itération:

IntStream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);

Le deuxième paramètre est un Lambda, qui retournera true lorsque l'élément de l'IntStream actuel atteint 100. Donc, cet exemple simple consiste à imprimer 1 à 99 sur la console.

En plus de l'extension de Stream lui-même, la combinaison entre Optional et Stream a également été améliorée. Vous pouvez maintenant convertir un objet facultatif en un objet Stream (éventuellement vide) via la nouvelle méthode optionnelle stram:

Stream<Integer> s = Optional.of(1).stream();

La conversion facultative en flux est très utile lors de la combinaison de pipelines Stream complexes.

7. Méthode d'interface privée

Java 8 nous apporte la méthode par défaut de l'interface. Les interfaces peuvent désormais contenir des comportements au lieu de simplement des signatures de méthode. Cependant, que se passe-t-il s'il existe plusieurs méthodes par défaut sur l'interface et que le code est presque le même? Habituellement, vous refactoriserez ces méthodes et appelerez une méthode privée réutilisable. Mais la méthode par défaut ne peut pas être privée. La création de code réutilisé comme méthode par défaut n'est pas une solution, car la méthode auxiliaire fera partie de l'API publique. Avec Java 9, vous pouvez ajouter des méthodes d'assistance privées à l'interface pour résoudre ce problème:

public interface MyInterface {

    void normalInterfaceMethod();

    default void interfaceMethodWithDefault() {  init(); }

    default void anotherDefaultMethod() { init(); }

    // This method is not part of the public API exposed by MyInterface
    private void init() { System.out.println("Initializing"); }
}

Si vous développez une API à l'aide des méthodes par défaut, les méthodes d'interface privée peuvent aider à construire son implémentation.

8, HTTP / 2

Il existe de nouvelles façons de gérer les appels HTTP dans Java 9. Cette fonctionnalité tardive est utilisée pour remplacer l'ancienne API HttpURLConnection et prendre en charge WebSocket et HTTP / 2. Remarque: La nouvelle API HttpClient est fournie sous la forme d'un module d'incubateur dans Java 9. En d'autres termes, cette API ne peut garantir un achèvement à 100%. Mais vous pouvez commencer à utiliser cette API dans Java 9:

HttpClient client = HttpClient.newHttpClient();

HttpRequest req =
   HttpRequest.newBuilder(URI.create("http://www.google.com"))
              .header("User-Agent","Java")
              .GET()
              .build();

HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());

En plus de ce modèle simple de demande / réponse, HttpClient fournit également de nouvelles API pour gérer les fonctionnalités HTTP / 2, telles que le streaming et le push côté serveur.

9. JAR compatible avec plusieurs versions

La dernière fonctionnalité sur laquelle nous allons nous concentrer est une excellente nouvelle pour les responsables de la bibliothèque. Lorsqu'une nouvelle version de Java apparaît, il faudra des années aux utilisateurs de votre bibliothèque pour passer à cette nouvelle version. Cela signifie que la bibliothèque doit être rétrocompatible avec la version la plus ancienne de Java que vous souhaitez prendre en charge (dans de nombreux cas Java 6 ou 7). Cela signifie en fait que pendant longtemps dans le futur, vous ne pourrez pas utiliser les nouvelles fonctionnalités fournies par Java 9 dans la bibliothèque. Heureusement, la fonction JAR compatible multi-version vous permet de créer une version de classe que vous pouvez choisir d'utiliser uniquement lorsque vous exécutez un programme de bibliothèque dans une version spécifique de l'environnement Java:

multirelease.jar
├── META-INF
│   └── versions
│       └── 9
│           └── multirelease
│               └── Helper.class
├── multirelease
    ├── Helper.class
    └── Main.class

Dans le scénario ci-dessus, multirelease.jar peut être utilisé dans Java 9, mais la classe Helper n'utilise pas la classe multirelease.Helper de niveau supérieur, mais celle sous "META-INF / versions / 9".

Il s'agit d'une version de classe spécialement préparée pour Java 9, qui peut utiliser les fonctionnalités et les bibliothèques fournies par Java 9. Dans le même temps, l'utilisation de ce JAR dans les versions antérieures de Java peut également s'exécuter, car les anciennes versions de Java ne verront que la classe d'assistance au niveau supérieur.

Comme vous pouvez le voir, Java 9 fournit de nombreuses fonctionnalités, grandes ou petites, êtes-vous prêt?

Original: https://www.pluralsight.com/blog/software-development/java-9-new-features
Traduction: Tocy, LeoXu, chef, Border Town,
Xibian Nine Festivals Traduction: www.oschina.net/translate/java -9-nouvelles-fonctionnalités

Je suppose que tu aimes

Origine blog.csdn.net/qq_21383435/article/details/108496915
conseillé
Classement