Passer aux informations sur le produit
Développeur Java avec de solides bases (2e édition)
Développeur Java avec de solides bases (2e édition)
Description
Introduction au livre
De la JVM aux technologies avancées telles que la performance, la concurrence et la conteneurisation.

Java est au cœur du génie logiciel d'entreprise.
Pour devenir un excellent développeur Java, il faut maîtriser les fondamentaux.
Ce livre examine comment l'écosystème Java et son cycle de publication ont évolué depuis Java 8, en abordant plus particulièrement les nouvelles fonctionnalités ajoutées dans Java 11 et 17.
Découvrez des fonctionnalités puissantes telles que les modules Java et les modèles de concurrence, le chargement de classes, les techniques avancées d'optimisation des performances et le bytecode, ainsi que des technologies modernes essentielles comme le développement piloté par les tests et le déploiement basé sur les conteneurs.
Il vous permet de perfectionner vos compétences en Java et de construire des bases solides en abordant d'autres langages JVM tels que Kotlin et Clojure.
  • Vous pouvez consulter un aperçu du contenu du livre.
    Aperçu

indice
À propos de l'auteur et du traducteur xv
Préface du traducteur xvii
Revue du lecteur bêta xviii
Préface recommandée (Heinz Kabutz) xx
À partir du xxii
Remerciements xxv
À propos de ce livre xxviii
À propos de la couverture xxxii

PARTIE I Versions 8 à 11 et suivantes 1

CHAPITRE 1 : Introduction à Java 3 moderne
1.1 Langue et plateforme 4
1.2 Nouveau modèle de publication Java 6
1.3 Inférence de type améliorée (mot-clé var) 10
1.4 Modifications de la langue et de la plateforme 15
1.5 Modifications mineures dans Java 11.20
▶ Résumé 30

CHAPITRE 2 Modules Java 31
2.1 Informations générales 32
2.2 Syntaxe de base du module 41
2.3 Modules de chargement 45
2.4 Création de votre première application modulaire 48
2.5 Architecture des modules 55
Au-delà des modules 2.6, 64
▶ Résumé 66

CHAPITRE 3 Java 17 67
3.1 Bloc de texte 67
3.2 expression de commutation 69
3,3 record 73
3.4 scellé type 85
3.5 Nouvelle forme d'instance de 91
3.6 Fonctions de correspondance de motifs et d'aperçu 92
▶ Résumé 96

PARTIE II Aller plus loin 97

CHAPITRE 4 Fichiers de classe et bytecode 99
4.1 Chargement des classes et objets de classe 100
4.2 Chargeur de classes 105
4.3 Examen du dossier de classe 117
4.4 Bytecode 123
4.5 Réflexion 138
▶ Résumé 144

CHAPITRE 5 : Principes fondamentaux de la concurrence en Java 145
5.1 Introduction à la théorie de la concurrence 146
5.2 Concept de conception 151
5.3 Concurrence structurée par blocs (avant Java 5) 156
5.4 Modèle de mémoire Java 179
5.5 Comprendre la concurrence avec le bytecode 182
▶ Résumé 205

CHAPITRE 6 Bibliothèque de concurrence JDK 206
6.1 Éléments constitutifs des applications concurrentes modernes 206
6.2 Classe atomique 207
6.3 Classe de serrure 209
6.4 Verrou à compte à rebours 212
6.5 ConcurrentHashMap 214
6.6 CopyOnWriteArrayList 225
6.7 File d'attente bloquante 229
6.8 Futur 239
6.9 Tâches et exécution 243
▶ Résumé 251

CHAPITRE 7 Comprendre les performances de Java 252
7.1 Définitions de base de certains termes relatifs à la performance 255
7.2 Une approche pratique de l'analyse des performances 258
7.3 Pourquoi devriez-vous vous soucier de ce qui ne va pas ? 265
7.4 Pourquoi l'optimisation des performances en Java est-elle difficile ? 269
7.5 Collecte des ordures ménagères 274
7.6 Compilation JIT dans Hotspot 284
7.7 Enregistreur de vol JDK 291
▶ Résumé 298

PARTIE III Langages non-Java sur la JVM 299

CHAPITRE 8 Autres langages JVM 301
8.1 Taxonomie linguistique 302
8.2 Programmation multilingue sur la JVM 307
8.3 Comment choisir la langue de visa pour votre projet 314
8.4 Comment la JVM prend en charge d'autres langages 318
▶ Résumé 322

CHAPITRE 9 Kotlin 323
9.1 Pourquoi utiliser Kotlin ? 324
9.2 Commodité et simplicité 325
9.3 Une autre perspective sur les classes et les objets 337
9.4 Sécurité 345
9.5 Concurrence 349
9.6 Interopérabilité avec Java 353
▶ Résumé 358

CHAPITRE 10 Fermetures : une perspective différente sur la programmation 359
10.1 Introduction à Clojure 360
10.2 Fermetures : syntaxe et sémantique 370
10.3 Programmation fonctionnelle et fermetures 388
10.4 Introduction aux séquences de fermeture 390
10.5 Interopérabilité entre Clojure et Java 397
10.6 Macro 403
▶ Résumé 410

PARTIE IV Création et déploiement 411

CHAPITRE 11 Création de contenu avec Gradle et Maven 413
11.1 Pourquoi les outils de construction sont importants pour les développeurs possédant de solides compétences fondamentales 413
11.2 Maven 419
11.3 Gradle 450
▶ Résumé 481

CHAPITRE 12 Exécution de Java dans un conteneur 482
12.1 Pourquoi les conteneurs sont importants pour les développeurs maîtrisant les fondamentaux 483
12.2 Notions de base de Docker 487
12.3 Développement d'applications Java avec Docker 494
12.4 Kubernetes 510
12.5 Observabilité et performance 519
▶ Résumé 524

CHAPITRE 13 PRINCIPES DE BASE DES TESTS 525
13.1 Pourquoi le test 526
13.2 Méthode d'essai 526
13.3 Développement piloté par les tests 530
13.4 Test Double 539
13.5 Juin 4 au 5 552
▶ Résumé 559

CHAPITRE 14 Tests au-delà de JUnit 560
14.1 Tests d'intégration à l'aide de conteneurs de test 560
14.2 Tests de type spécification avec Spek et Kotlin 572
14.3 Tests basés sur les propriétés avec fermetures 579
▶ Résumé 594

PARTIE V : Nouvelles frontières en Java 595

CHAPITRE 15 PROGRAMMATION FONCTIONNELLE AVANCÉE 597
15.1 Introduction aux concepts de la programmation fonctionnelle 598
15.2 Limites de Java en tant que langage de programmation fonctionnelle 603
15.3 Programmation fonctionnelle Kotlin 619
15.4 Programmation fonctionnelle Clojure 637
▶ Résumé 644

CHAPITRE 16 PROGRAMMATION CONCURRENTE AVANCÉE 645
16.1 Framework Fork/Join 646
16.2 Programmation concurrente et fonctionnelle 653
16.3 Un aperçu des coroutines Kotlin 660
16.4 Concurrence Clojure 669
▶ Résumé 685

CHAPITRE 17 : La structure interne la plus récente 686
17.1 Introduction aux mécanismes internes de la JVM : Appel de méthode 687
17.2 Réflexion intérieure 694
17.3 Méthode Handle 700
17.4 Invokedynamic 707
17.5 Petites modifications internes 713
17.6 Non sécurisé 721
17.7 Remplacement des API non sécurisées par des API prises en charge 726
▶ Résumé 731

CHAPITRE 18 L'avenir de Java 732
18.1 Projet Ambre 733
18.2 Projet Panama 735
18.3 Salle de projet 743
18.4 Projet Valhalla 753
18.5 Java 18 762
▶ Résumé 763

ANNEXE A Choisir Java 765
A.1 Java est toujours gratuit 765
A.2 Maintenance de Java SE 8 766
A.3 Obtenez Java SE 11 766
A.4 Obtention de Java SE 17 (version à support à long terme) 767
A.5 Assistance payante 768

ANNEXE B Résumé des flux en Java 8 769
B.1 Compatibilité descendante 769
B.2 Méthode par défaut 770
B.3 Flux 772
B.4 Limites de la collecte 776
B.5 Flux infini 776
B.6 Manipulation des types primitifs 777
B.7 Opérations parallèles ? 779

Recherche 781

Image détaillée
Image détaillée 1

Dans le livre
Le format JMOD est assez similaire au format JAR existant, mais il a été modifié pour permettre l'inclusion de code natif dans un seul fichier, au lieu de fournir un fichier objet partagé séparé comme dans Java 8.
Pour la plupart des développeurs, comme ceux qui publient des modules sur Maven, il est préférable de conditionner leurs modules sous forme de JAR modulaires plutôt que de JMOD.
Le format JIMAGE est utilisé pour représenter les images d'exécution Java.
Avant Java 8, il n'existait que deux images d'exécution : le JDK et l'environnement d'exécution Java (JRE), mais il s'agissait surtout d'un accident historique.
Oracle a introduit le JRE serveur avec Java 8 (et son profil compact) comme une étape intermédiaire vers une modularisation complète.
Cette image supprime essentiellement certaines fonctionnalités (par exemple, l'interface graphique) afin de prendre moins de place et de répondre aux besoins des applications côté serveur.

--- p.34

Supposons que nous voulions modéliser différentes commandes en Java 11.
Dans ce cas, vous devez choisir entre deux alternatives.
Tout d’abord, nous pouvons choisir FXOrder, une classe d’implémentation unique (ou un enregistrement) avec un champ d’état qui contient le type réel.
Ce modèle fonctionne en faisant du champ d'état une énumération, fournissant des informations sur le type que cet objet représente réellement.
Ce modèle peut s'avérer une solution sous-optimale car il oblige le programmeur d'applications à vérifier et à suivre manuellement chaque type possible qu'un champ peut avoir.
Vous pouvez également déclarer une classe abstraite de base appelée BaseOrder et la sous-classer pour avoir des types concrets comme MarketOrder et LimitOrder.

--- p.86

De nombreux codes d'opération possèdent des formes abrégées permettant d'économiser quelques octets ici et là.
Il est fréquent que certaines variables locales soient consultées beaucoup plus fréquemment que d'autres ; il est donc judicieux d'utiliser des codes d'opération spéciaux qui signifient « effectuer l'opération générale directement sur la variable locale » au lieu de spécifier la variable locale comme argument.
Par exemple, dans la famille des opérations de chargement/stockage, les codes d'opération tels que aload_0, dstore_2 sont plus courts d'un octet que les séquences d'octets équivalentes aload 00 ou dstore 02.

--- p.138

La classe FutureTask est l'une des implémentations couramment utilisées de l'interface Future, et implémente également Runnable.
Cela signifie que nous pouvons transmettre une FutureTask à un exécuteur.
L'API de FutureTask est essentiellement une combinaison de Future et de Runnable.
Il existe des méthodes telles que get(), cancel(), isDone(), isCancelled() et run().
Cependant, la méthode finale qui effectue le travail proprement dit n'est pas appelée directement par le code client, mais par l'exécuteur.
FutureTask propose deux constructeurs pratiques :
L'un utilise Callable, l'autre utilise Runnable (dans ce cas, nous utilisons Executors.callable() pour convertir Runnable en Callable).
Cela offre une méthode flexible pour gérer les tâches, en les écrivant sous forme de Callables, puis en les encapsulant dans un FutureTask, qui est un Runnable, afin qu'elles puissent être planifiées pour exécution par un exécuteur et annulées si nécessaire.

--- p.245

Les conteneurs ont ouvert la voie à des emballages plus uniformes pour le déploiement.
Auparavant, tout était différent : la manière dont les octets de l'application étaient copiés dans l'environnement de déploiement, la manière dont les dépendances du système d'exploitation étaient gérées, et même la manière dont les processus étaient lancés.
Les conteneurs apportent la solution à tout cela, éliminant ainsi le besoin d'une multitude d'outils et de scripts personnalisés.
Il assure également une isolation entre l'environnement de déploiement et le contenu du conteneur.
Un moteur de conteneurs n'a pas à se soucier de l'organisation du contenu d'un conteneur ; il lui suffit de savoir comment démarrer sur demande.
L'utilisation d'images de conteneurs d'emballage est un excellent exemple d'infrastructure en tant que service (IaaS), utilisant des descriptions déclaratives et contrôlées par version des couches système.
Contrairement à ce qui se faisait par le passé, où une construction impérative et rigoureuse était nécessaire, cela se fait désormais plus facilement.

--- p.486

De nombreux langages fonctionnels, comme Haskell, reposent fortement sur l'évaluation paresseuse.
Kotlin est un langage JVM qui ne privilégie pas l'évaluation paresseuse dans son modèle d'exécution principal.
Cependant, l'interface Lazy offre la meilleure prise en charge du délai là où il est nécessaire.
Cela fournit une structure standard lorsque vous souhaitez différer le traitement ou le sauter complètement.
En général, nous n'implémentons pas directement Lazy, mais nous créons plutôt une instance à l'aide de la fonction lazy().
Dans sa forme la plus simple, lazy() prend une lambda, et le type de retour de cette lambda détermine le type de l'interface T renvoyée.
Les fonctions Lambda ne sont exécutées que lorsque la valeur est explicitement demandée.
Vous pouvez également vérifier si la valeur a déjà été calculée comme ceci :
--- p.631

Avis de l'éditeur
Comment devenir un meilleur développeur Java

Java est un langage déjà familier à de nombreux développeurs.
Il a été développé par Sun Microsystems en 1995 et est apprécié depuis plus de 30 ans, avec la sortie de Java 21.
Quand on s'habitue à quelque chose, on a tendance à oublier son intention initiale.
Si vous voulez devenir un meilleur développeur qu'il ne l'est actuellement, vous devez maîtriser les fondamentaux.
Plus vos fondamentaux sont solides, mieux vous pourrez vous adapter et tirer parti de l'évolution de l'environnement technologique en tant que développeur.
Si vous souhaitez acquérir de solides bases en Java et que vous avez des difficultés à apprendre de nouvelles versions de Java en raison du cycle de publication rapide de six mois et du fait que Java 8 est toujours utilisé même après la sortie de Java 21, alors ce livre est fait pour vous.

Il s'agit de la deuxième édition de 《The Well-Grounded Java Developer》, publiée en 2012, et qui contient tout ce qui a changé dans le domaine de Java au cours de la dernière décennie.
Java 7 est devenu la norme, avec Java 8 et 11, et Scala est devenu un langage JVM très puissant.
Ce livre explique de manière systématique les principales caractéristiques et les changements intervenus entre Java 8 et 17, en suivant un ordre chronologique.
Il montre comment appliquer des fonctionnalités modernes telles que les expressions lambda, l'API de flux, le système de modules et les blocs de texte à du code réel, et explore largement le langage JVM.

Il se compose d'un total de 5 parties.
La première partie examine de plus près les versions 8 à 11.
Nous commencerons par examiner les améliorations d'ergonomie incluses dans Java 11, ainsi que la procédure de mise à niveau vers Java 17, et nous explorerons comment l'écosystème Java et le cycle de publication ont évolué depuis Java 8.
Vous en apprendrez notamment davantage sur l'ajout d'un système entièrement modulaire et sur la manière de l'exploiter dans vos applications et bibliothèques.

Dans la deuxième partie, nous verrons comment fonctionne réellement la JVM.
Les développeurs Java doivent connaître les fonctionnalités de concurrence de Java, et la partie 2 vous montre comment tirer pleinement parti des processeurs modernes.
De plus, nous nous concentrons sur deux éléments majeurs de la JVM qui affectent les performances : le ramasse-miettes et le compilateur JIT.
La partie 3 traite de la programmation multilingue sur la JVM.
La programmation fonctionnelle continue de gagner du terrain comme alternative à la perspective orientée objet classique exprimée en Java, et nous explorons Kotlin et Clojure pour comprendre ce phénomène.

La partie 4 explique comment utiliser efficacement les outils pour créer, tester et déployer des applications Java.
Nous explorerons deux des outils de construction Java les plus utilisés, Maven et Gradle, des méthodes spécifiques pour intégrer des environnements d'applications Java dans des conteneurs, différentes approches de test, ainsi que les avantages et les inconvénients de chacune.
Dans la partie 5, nous approfondirons ce que nous avons appris jusqu'à présent et explorerons plus en détail la programmation fonctionnelle, la concurrence et les mécanismes internes de la plateforme.
L'annexe aborde brièvement la question du choix entre Java et la programmation fonctionnelle en relation avec les flux Java 8.

Ce livre vous aidera à découvrir de nouvelles fonctionnalités Java, à vous familiariser avec des technologies logicielles modernes essentielles comme le développement piloté par les tests et le déploiement basé sur les conteneurs, et à apprendre des langages non-Java sur la JVM.
Ce guide vous sera d'une grande aide pour évoluer et devenir un excellent développeur Java, au-delà de simples bases solides.

Contenu principal

Nouvelles fonctionnalités de Java 11 et 17
Comment exécuter une JVM dans un conteneur
Comment utiliser la bibliothèque de concurrence JDK
• L'importance d'autres langages JVM tels que Kotlin et Clojure
Comment optimiser l'intégration et la livraison continue (CI/CD) avec Maven et Gradle
• Interaction entre la concurrence et la programmation fonctionnelle
SPÉCIFICATIONS DES PRODUITS
- Date d'émission : 14 août 2024
- Nombre de pages, poids, dimensions : 828 pages | 188 × 245 × 39 mm
- ISBN13 : 9791193926277

Vous aimerez peut-être aussi

카테고리