![[baldir_loupe.jpg|320x223]]
---
## Java dans les grandes lignes
Langage de programmation **[[Glossaire général#Couche d’abstraction|haut niveau]]**, **[[Glossaire général#Paradigme de programmation orientée objet|orienté objet]]** **[[Glossaire général#Typage fort|fortement typé]]**, basé sur les [[Glossaire général#Classe|classes]], créé en 1995
Version actuelle [[Glossaire général#Long Term Support|LTS]] : **Java 25**
![[Duke.gif|200x150]]
Duke - mascotte de Java
---
## Caractéristiques
**Simplicité** (pas de notion de pointeur, pas d'héritage multiple, pas de surcharge d'opérateurs)
**Mémoiré gérée** automatiquement par un "Ramasse-miettes" ([[Glossaire général#Garbage collector|garbage collector]])
**Interprété** (par la [[Glossaire général#JVM|JVM]])
**Économe** ([[Glossaire général#Bibliothèque|bibliothèques]] de classes liées à l'exécution)
**Portable** (indépendant de plateforme)
**Multitâches** ([[Glossaire général#Multi-threading|Multi-threadée]] et [[Glossaire général#Programmation concurrente|programmation concurrente]])
**Scalabilité :** multi-threading, capable d'ingérer de grande quantités de données de sources multiples, optimisation lors de l'exécution
**Sécurité intégrée** (vérification de [[Glossaire général#Bytecode|byte code]], signature de [[Glossaire général#Jar|Jar]], algorithmes de chiffrement et cryptographie)
---
## Philosophie
> _« Write once, run anywhere »_
![[David_goodenough.png|240x157]]
---
### The good parts
**Stabilité :** culture de la [[Glossaire général#Rétro-compatibilité|rétro-compatibilité]]
**Outillage** créé par la communauté **fortement intégré** au langage (si l'outil n'existe pas on n'hésitera pas à le créer sans attendre que l'écosystème évolue) : beaucoup de vendeurs de tierces parties
**Open-source** : dépendances, outillage et depuis quelques années, le langage est open-source
---
### Le revers de la médaille
Documentation extrêmement **fragmentée**, difficile d'accès aux débutant-es
Un côté un peu "administratif" et [[Glossaire général#Verbosité|verbeux]]
Une culture souvent "corporate" voire austère, parfois résistante au changement
> *Opinion subjective de l'enseignant après quelques années à programmer en Java dans quelques entreprises
---
## Processus de spécification et standardisation
[openjdk.org](https://openjdk.org/)
- [[Glossaire général#JCP - Java Community Process Program|JCP]] : Java Community Process Program
- [[Glossaire général#JEP - JDK Enhancement Proposals|JEP]] : JDK Enhancement Proposals
- [[Glossaire général#JSR - Java Specification Requests|JSR]] : Java Specification Requests
- [[Glossaire général#JCK - Java Compatibility Kit|JCK]] : Java Compatibility Kit
---
### JCP : Java Community Process Program
Java Community Process Program : [jcp.org/en/home/index](https://jcp.org/en/home/index)
Le comité de spécification du langage et de la JVM
- Contributions open-sources acceptées
- Surtout des grands acteurs de la tech
- Gouvernance partagée
- Ryhtme de versions : tous les 6 mois
---
### JEP : JDK Enhancement Proposals
Proposition informelle d'amélioration du JDK ou OpenJDK, invitation à l'expérimentation.
Pas encore mature pour devenir une spécification.
[openjdk.org/jeps](https://openjdk.org/jeps/0)
---
### JSR : Java Specification Requests
Prend une idée mature (souvent venant d'une JEP) et tente d'en faire une spécification formelle (toutes les JSR ne vont pas jusqu'au bout)
Une JSR finalisée aboutit à une **[[Glossaire général#Implémentation|implémentation]] de référence** dans OpenJDK
---
### JCK : Java Compatibility Kit
Tests automatisés de compatibilité de JDK destiné aux implémenteurs de JDK. tierces parties
---
## Historique des versions
![[java_historique_versions.webp|540x261]]
Source : https://dev.java/evolution/#accelerating-innovation
Evolutions majeures de Java
https://en.wikipedia.org/wiki/Java_version_history
| **Java** | **Années** | **Nouveautés langage** | **Nouveautés Jvm / GC / outils** |
| ----------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 22 - **25** | 2024 - 2025 | - `_` : variables non nommées et patterns<br>- **/// javadoc en Markdown**<br>- **Stream gatherers**<br>- Amélioration de la cryptograhpie<br>- mécanismes d'encapsulation resistants au quantique<br>- API Key Derivation Function<br>- **Déclaration d'import de modules**<br>- void main()<br>- IO.println()<br>- Corps de constructeurs flexibles<br>- **Fichiers de sources compacts et méthodes main d'instance**<br><br>Petits veinards | - `java` : lancement de programmes multi-sources multi-fichiers<br>- Optimisations du garbage collector G1<br>- Optimisation : Object compact headers<br>- Foreign functions et Memory API<br>- Mode générationnel du garbage collector ZGC par défaut<br>- Optimisation : **Ahead-of-Time Class Loading & Linking**<br>- Class file API<br>- Suppression du portage 32 bits x86<br>- API Scoped values<br>- Ahead-of-Time Command-Line Ergonomics<br>- Ahead-of-Time Method Profiling<br>- Java Flight Recorder<br>- amélioration de stabilité<br>- methods timing and tracing<br>- Garbage collector Shenandoah : mode générationnel |
| 18 - **21** | 2022 - 2023 | 1. SequencedCollections: SequencedSet, SequencedMap,...<br>2. UTF-8 par défaut<br>3. Record patterns<br>4. Pattern matching pour switch<br>5. Virtual Threads<br>6. API KEM : amélioration de la cryptographie | - **jwebserver** : web server simple java, SimpleFileServer<br>- Réimplémentation de la reflection pour optimisation<br>- ZGC : mode generationnel |
| 12 - **17** | 2019 - 2021 | 1. Helpful NullPointerExceptions<br>2. **Blocs de texte """**<br>3. Pattern Matching pour instanceof<br>4. **Records**<br>5. **sealed** : classes scellées | 1. Amélioration de garbage collectors<br>2. Garbage collectors ZGC, Shenandoah<br>3. Migration du code source Java sur Git et GitHub<br>4. Optimisation : Elastic metaspace<br>5. **jpackage** : outil en CLI pour packager des applications java auto porteuses |
| 10 - **11** | 2018 | 1. var : inférence de type de variables locales<br>2. Http Client<br>3. TLS 1.3<br>4. JavaFx, JavaEE et Corba, sortent du JDK | 1. Optimisation de mémoire et de temps de démarrage : Application class-data sharing<br>2. Parallel full GC pour G1<br>3. Flight Recorder : analyseur de performances<br>4. Lancement d'un fichier seul : java Monfichier.java |
| 9 | 2017 | 1. Jigsaw : modules<br>2. Fabriques pour les collections : List.of(), Map.of(), ...<br>3. jShell : Repl java<br>4. Amélioration des perfs du moteur de rendu graphique<br>5. Javadoc HTML5 avec recherche | 1. Multi-release des fichiers Jars<br>2. Garbage collector G1 par défaut<br>3. Meilleure performance pour les chaines de caractères<br>4. jlink: permet de créer une image personnalisée optimisée<br>5. AOT (Ahead of Time) compilation : compilation classes en code natif via GraalVM |
| **8** | 2014 | 1. **Lambdas et Streams**, functional interfaces, Predicate<br>2. Références de méthodes<br>3. Interfaces : Méthodes par défaut, méthodes static<br>4. API java.time<br>5. Annotations sur les types | 1. **jdeps** : outil en CLI pour analyser les dépendances d'une application Java |
| 7 | 2011 | 1. Notation binaire et formattage d'expressions numériques<br>2. Switch sur les String<br>3. Inférence de type sur la création de generics <><br>4. Exceptions: try with resources, multicatch<br>5. nio : nouvelle API pour les I/O | 1. **Support des langages dynamiques (InvokeDynamic) dans le bytecode**<br>2. Tiered compilation<br>3. Compressed Oops (optimisation pour les jvm 64bits)<br>4. Escape analysis<br>5. Amélioration du garbage collector ParallelGC pour architectures NUMA |
| 1.6 | 2006 | 1. JDBC 3.0<br>2. **XML et Webservices**<br>3. StaX : streaming API for XML<br>4. JaxB 2.0 : serialiseur XML<br>5. Jax-Ws : Bindings Soap et web-services<br>6. AWT/Swing : amélioration de l'intégration aux systèmes d'exploitation<br>7. Collections : nouvelles interfaces : Deque, NavigableSet, NavigableMap | 1. Optimisation :<br>2. Class File Specification Update<br>3. Performance : synchronisation, compilation |
| **5** | 2004 | 1. **API de concurrence** : ConcurrentMap, Executor, Callable, CompletionService, RunnableFuture, Semaphore, Atomic...<br>2. **Métaprogrammation par annotations**<br>3. **Generics**<br>4. Nouveautés du langage<br>5. Autoboxing des types primitifs<br>6. **enum : types énumérés type-safe**<br>7. **for (Type variable : iterable) : itérations simplifiées**<br>8. foo(Type ... args) : Méthodes à arguments variables (varargs)<br>9. printf("foo %lf bar %lf",2.5d, 2d) : nouvelle méthode printf)<br>10. Scanner : gestion des flux standards<br>11. **import static** | 1. API de management<br>2. API JMX : Java management extensions<br>3. JVMTI : profiling natif |
| **1 - 1.4** | 1996 - 2002 | Omis pour brieveté | Omis pour brieveté |
---
## Écosystème JVM : pas seulement Java
![[Ecosysteme_jvm.webp]]
---
### Diversité d'usages
![[j01-java - Java _ Diversité d'usages.webp]]
---
### Plateforme java : Editions
| **Nom** | **Utilisation** |
| ------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
| J2SE (Standard Edition) | Pour les applications de bureau, les scripts en ligne de commande, ou applications généralistes |
| Jakarta EE anciennement J2EE (Enterprise Edition) | Extensions pour les applications Web et entreprise |
| Java ME / Java SE Embedded | Pour les logiciels embarqués |
| Android SDK | Développement Mobile |
> [!note]- Il est possible de composer
> On peut piocher dans des parties de ces éditions pour be prendre que ce qui nous interesse.
> On peut par exemple utiliser quelques mécanismes provenant de jakarta EE pour simplifier l’accès aux base de données, la lecture de fichiers json ou encore des mécanismes d’injection de dépendances. Sans utiliser tout le reste.
---
### JVM : Java Virtual Machine
![[j01-java - JVM _ Java Virtual Machine.webp]]
---
### Plateforme java : JDK
![[Pasted image 20260210120146.webp]]
---
### Outillage de base
**Java SDK/JDK**
- via [Sdkman](https://sdkman.io/)
- Téléchargé : https://adoptium.net/fr
- Installé depuis l'IDE
- IntelliJ Idea
- Eclipse
- VsCode (peu recommandé)
![[Pasted image 20260210120312.webp|200]]
---
### En bref
Java, connu pour ses **fonctionnalités robustes** et son **indépendance vis-à-vis des plateformes**, est l'un des langages de programmation les plus utilisés.
Sa **syntaxe claire** et sa **gestion automatique de la mémoire** contribuent à sa popularité.
---
# À suivre
[[Activité - à la découverte de Idea]]