Java pourquoi et comment

Bernard AMADE


Table des matières

Preface
Pour les débutants en programmation
Installation des outils
Installation du JDK
Réglages de l’environnement
Installation d’un I.D.E (outil de développement intégré)
Lancement de JShell
Types primitifs, variables
Valeurs entières
Opérations
Limites
Nombres "flottants"
Opérations
Limites
Variables
Les types primitifs numériques
Les types entiers
les "littéraux" (valeurs entières)
Compatibilités entre types entiers
Numériques en virgule flottante
Les valeurs "littérales" des nombres flottants.
Compatibilités entre types numériques
Affectations optimisées
Valeurs logiques
Expressions logiques
Connecteurs
Aiguilleur d'évaluation
Opérateurs bit à bit
Caractères et chaînes de caractères
Type caractère
Chaînes de caractères (String)
Formes fonctionnelles
Codes appelants, codes réalisants
La technologie java: généralités
Du code source au code binaire
Compilation
Code Source
Code binaire
Un exemple d’une petite application java: les Applets
Un exemple sur le Web
Principes Architecturaux
Caractéristiques remarquables de Java
La machine virtuelle Java (J.V.M.)
Origines et objectifs du langage
Pourquoi Java?
La documentation Java
Les logithèques standard
Introduction aux types composites
Aggrégats de données
Les données en mémoire
Manipulation de données, gestion de la mémoire
Valeurs scalaires dans la mémoire
Allocations des objets dans la mémoire
Constructeurs
Initialisations de l'état des objets
"Valeurs" (Value Objects)
Méthodes d’instance : introduction
Méthodes statiques
Méthodes d’instance/méthodes statiques: un exemple
Champs statiques
Tableaux
Tableaux de tableaux
Compatibilités entre types tableaux
Types énumérés (enums)
Syntaxe, structure du code
Structure générale d’un code (simplifiée)
Déclarations des variables membres
Déclaration de méthodes
Déclaration de constructeurs
Principes de la syntaxe
Commentaires
Identificateurs
Conventions de codage
Mots-clef
Blocs, portée des noms
Typage implicite de variables locales
La référence this
if/else
switch
while/do-while
boucles for
break, continue
Arguments en nombre variable
Programmation orientée objet en Java
Les types définis par le programmeur
L’encapsulation
Les conventions "Accesseur/Mutateur"
Accesseurs, mutateurs et autres méthodes
Les "cercles" de responsabilité
private
public
"friendly"
Packages
directives import
import static
Introduction aux modules
L’organisation et les répertoires en pratique
Les chemins d’accès aux classes
Organisation simplifiée , module par défaut
Synthèse des rôles de programmation
Les architectures modulaires
dépendances explicites
dépendances dynamiques
Composition, association, héritage
Définition d’un objet à partir d’autres objets: composition, association
Définition d’un objet à partir d’un autre objet: délégation
Définition d’un objet à partir d’un autre objet: définition différentielle (héritage)
Définition d’une sous-classe
Constructeurs dans une sous-classe
Polymorphisme
La classe Object
spécialisation des méthodes de Object
Spécialisation de toString()
Spécialisation de equals
Modules, responsabilité et relations entre classes
Modificateur de portée protected
final et l’héritage
Exceptions
Ce qu’il ne faudrait pas faire en cas d’incident
Catégories d’incidents
Le mécanisme des exceptions
try/catch
Exceptions standard
Definir une Exception
Déclenchement d’une Exception
blocs catch hiérarchisés
blocs finally
La règle "propager ou traiter"
Exception de runtime ou exception controlée?
Modèle d’une signature
Differences entre exceptions et rapports
Notes sur les exceptions
Assertions
Abstraction, généralisation, structuration
Types abstraits
Méthodes abstraites et classes abstraites
Interfaces
Déclaration d’une interface
Documentation d’une interface
Réalisations conformes à une interface
Conception avec des interfaces, découplage
Découplage architectural
Découplage de code
Extension des interfaces
Héritage d’interface
Extensions par méthodes concrètes
Introduction aux types paramétrés (au travers des Collections)
Collections avec Object et le problème du typage
Contrôle de type par réalisation d’une classe spécifique
Contrôle de type avec un type paramétré
Enchainement des contrôles de compile time
Définition d’un type paramétré
Variable-type propre à une méthode
Invariance
Encapsulation et types paramétrés
Mise en pratique : quelques logithèques classiques
Principes de disposition des IHM
Les librairies graphiques
Composants et containers
Disposition
Gestionnaire de disposition FlowLayout
Gestionnaire de disposition BorderLayout
Autres gestionnaires de disposition
Combinaisons de dispositions
Gestion des interactions graphiques
Les objets "événement"
L’objet réflexe (call back pattern)
Interfaces de veille et "adaptateurs"
Considérations architecturales liées à la gestion des événements: un exemple
Considérations architecturales : veilleur dans une classe distincte
Considérations architecturales: veille depuis la classe courante
Considérations architecturales : veille depuis une classe interne
Considérations architecturales : veille depuis une classe anonyme
Considérations architecturales : transfert vers du code applicatif
"flots" d’entrée/sortie
Le modèle des "flots"
Flots associés à une ressource (node streams)
Filtres
flots d’octets: InputStream, OutputStream
Flots de caractères: Reader, Writer
Comparaison des flots par ressource
Conversions octets/caractères
Utilisation de filtres
Usage simple des Paths
Introduction à la programmation réseau
Principes généraux des échanges Client-Serveur sous TCP
Modalités d'établissement de la connexion en JAVA
E/S objets
ObjectInputStream, ObjectOutputStream
Les objets dans un flot
Effets de la linéarisation
Modifications des opérations liées aux objets Serializable
Le package java.nio
Mise en oeuvre de Buffers
Un exemple de mise en oeuvre de Buffers
Ventilation des lectures/écritures dans des Buffers
E/S asynchrones , sélecteurs
Expressions régulières
L’exécution et la programmation parallèle
L’exécution de Java
Les exécuteurs: évolutions de la technologie
La J.V.M: chargement et exécution des codes
compile time, load time, run time
La J.V.M. : gestion de la mémoire
Les performances
La J.V.M. : gestion de la sécurité
Unités d’exécution (Threads)
Multitâche: processus et "fils d’exécution" (threads)
Création et exécution d’un Thread
Interactions avec l’ordonnanceur
S’effacer devant d’autres Threads
Mise en narcose
Attente d’une fin d’exécution
Interruption
Etats d’une exécution (version 1)
Le "modèle mémoire" de Java
Synchronisations de mémoires
Blocs synchronized
Contention, blocs synchronized
Moniteurs multiples
Attente de condition
"Micro-Attente" optimisée
Etats d’une exécution (version 2)
Autres aspects de la programmation java, approfondissements
Types enchassés
Types membres de classe ( nested types)
Types membres d’instance ( inner types)
Exercice
Classes anonymes
Compléments sur les types paramétrés
Covariance
Contravariance
Autres exemples
Exercices
Comment fonctionnent les types paramétrés? Compatibilités.
Utilisation des variables-type
Utilisation des variables types dans des types paramétrés
Lambda-expressions, fermetures, références de codes
Principes des lambda-expressions
java.util.function
Fermetures (Closures)
Problématique des effets de bord
Références de codes
Programmation "au fil de l’eau" (streams)
Déploiements et Services
Déploiement des codes
Les ClassLoaders
Quels réceptacles pour entreposer les codes ?
Création des archives jar sans modules
Création des archives jar avec modules
Lancement direct d’une application non modulaire depuis une archive jar
Lancement d’une application modulaire avec des archives jar
Déploiement d’archives jar
Création d’une image applicative (Jlink)
Codes de déploiement, services
Codes de déploiement: chargement explicite
Codes hors modules
Codes avec modules
Déploiement standard de services
Déploiement de services en portée locale
Déploiement de service avec des modules
Variantes architecturales
Scripts enchassés
Ressources
Arguments de la commande de lancement
Propriétés nommées
Fichier de configuration
Déploiement en portée locale
Déploiement de ressources avec des modules
Contenu de fichier Properties
URL de ressources
Internationalisation
Contextes culturels : Locale
Locale : constructeurs, constantes
Contexte culturel: obtention, mise en place
Paramétrage de ressources: Resourcebundle
Où se trouve les ressources?
Nommage du service de Bundle en architecture modulaire
Réalisation du service dans un module
ListResourceBundle
PropertyResourceBundle
Classes de mise en forme/analyse
Numériques avec instructions de formatage
Autres formats
Rapports, traces, journalisations
Emettre un rapport
Les services de logging
Utilisation de java.util.logging
Qu’est ce qui détermine le comportement des Loggers?
Raccordements des gestionnaires de rapports (handlers)
Architecture de configuration
Définition d’un Handler
Définition d’un Formatter
Préférences
Principes
Contextes de nommage
Obtention d’un contexte
Consultation dans un contexte
Enregistrement d’une valeur
Harmonisation avec le système de rémanence
Applications autonomes "packagées"
Java Webstart
Introduction
Configuration minimum du serveur web
Exemple de ressource JNLP
Format compressé
Gestion de versions
Sécurité
De quelques bonnes pratiques
Algorithmes en Java
Les tris
Les recherches
Tables de hachage
Les compromis mémoire/performance
Composants "architecturaux": introduction aux design patterns
Modèle/Vue
Enregistrement/rappel (call-back)
Enregistrements multiples, diffusion
Programmation réactive avec Flow
Modèle, Vue, Contrôleur
Singleton
Méthodes "fabriques"
Un exemple plus complexe: le "décorateur"
Introduction: combinaison héritage/délégation
Introduction: un cas particulier d’héritage/délégation
Un arbre d’héritage complexe…
Application du pattern "décorateur" aux E/S en Java:
Programmation dynamique, annotations, liens vers d’autres formalismes
La programmation dynamique
La classe Class et ses méthodes fondamentales de découverte
Obtention de l’objet Class
Obtention des informations sur la classe
Le package java.lang.reflect
Les constructeurs
Les méthodes
Les champs
Les tableaux
Le package java.lang.invoke
Les combinaisons de type
Invocation de constructeurs
Invocation de méthodes
Mandataires dynamiques
Utilisation de la programmation dynamique par d’autres formalismes
Les annotations
Structures de données
Rétention des données
Entités annotables
Quelques annotations standard
Définition des annotations
Utilisation de la structure de données
Les méta-annotations
Déclarations simplifiées
Consultation par introspection
Liens vers d’autres formalismes
Utilisation de code natif
Pourquoi réaliser du code natif?
Un exemple : "Hello World" en C
Résumé des phases :
Ecriture du code JAVA
Création des binaires JAVA de référence
Génération du fichier d’inclusion C/C\++
Ecriture du code natif
Création d’une librairie dynamique
Exécution
Présentation de JNI
JNI: types, accès aux membres, création d’objets
Références sur des objets JAVA:
Exceptions
Liens vers d’autres langages
Liens vers des formalismes textuels
Aspects programmatiques avancés
Programmation parallèle et accès concurrents
Informations de pile
Les packages java.util.concurrent
Sémaphores
Verrous
Rendez-vous, passages de temoin
Trames d’exécution et promesses
Enchainements de promesses
Accès atomiques
Collections optimisées
Traitements parallélisables
Fork/join
Les références distantes (R.M.I.)
La notion de service distant
La définition d’un service distant
Principe de la communication entre objets distants
Exportation d’un objet
Le comportement des mandataires
Annuaire d’objets distants
Le serveur: enregistrement auprès du Registry
Le client: demande à l’annuaire
Check-list pour une mise en oeuvre simple
Compléments
Téléchargement dynamique des codes de classe
Contexte de sécurité
Mise en place du téléchargement des classes
Personnalisation des mécanismes sous-jacents à RMI
Serveurs dormants, serveurs résilients
Références faibles
Problématiques des caches mémoire
Les objets références
SoftReference
WeakReference
Opérations liées à l’abandon d’un objet, finaliseurs, PhantomReferences
Aspects architecturaux avancés
Strates et conteneurs
Les ClassLoaders
Les strates de modules
Les conteneurs
Annexes
Rappels
Syntaxe : principes des déclarations de premier niveau
Plan d’ensemble d’une déclaration de classe
Les packages: nommage, directive d’appartenance
Le fichier package-info.java
directives import
import static
Déclaration de classe
Champs: variables membres d’instance
Champs : variables partagées et constantes
Constructeurs
Méthodes d’instance
Méthodes de classe
Arguments en nombre variable
Blocs spéciaux
Bloc statique
Bloc d’instance (instance initializers)
Types définis dans une classe
Syntaxe : les codes
Déclarations locales
if/else
switch
while/do-while
Boucles for
Boucle foreach
break, continue
Etiquettes
Syntaxe: l’encapsulation automatique (autoboxing)
Caches sur les valeurs encapsulées
Outils
Les utilitaires standard de Java
Cas particulier de l’accessibilité
Remarques sur d’autres outils
Glossaire
Index