Le paysage de Java Programmation objet avancée Amphi 7 Thomas Nowak Université Paris-Sud Au programme • APIs de Java • d’autres langages orientés objet • d'autres langages sur la JVM • conclusion APIs de Java • Échanges de données : JAXB, org.json • Bases de données : JDBC, Hibernate • GUI : Swing, JavaFX • Web : EJB, Spring • Mobile : Android • Streams : expressions lambda Échanges de données : XML et JSON • XML : format hiérarchique de données, inspiré de HTML • initialement le format utilisé pour des requêtes AJAX (Asynchronous JavaScript And XML) • ex : <?xml version="1.0" encoding="UTF-8"?> <personne id="100"> <age>23</age> <nom>Toto</nom> </personne> Échanges de données : XML et JSON • une des librairies XML en Java : JAXB • peut transformer un fichier XML directement en objet qu’il décrit et vice versa • avec ça l’utilisation de XML comme format de stockage est transparent à l’utilisateur de JAXB • il faut annoter les données à stocker dans la classe Échanges de données : XML et JSON @XmlRootElement public class Personne { @XmlElement String nom; @XmlElement int age; @XmlElement int id; . . . } Échanges de données : XML et JSON File file = new File("pers.xml"); JAXBContext jaxbContext = JAXBContext.newInstance(Personne.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); Personne pers = (Personne) jaxbUnmarshaller.unmarshal(file); Échanges de données : XML et JSON • un format plus utilisé : JSON • collection de couples key/value • ex: {"id": 100, "nom": "Toto", "age": 23} • peut être converti en objet aussi : librairie Jackson Bases de données • JDBC pour se connecter et lancer des requêtes SQL • ex : ResultSet rs = stmt.executeQuery( "SELECT * FROM MyTable" ) • JDBC pour se connecter et lancer des requêtes SQL • convertir des objets Java avec la librairie Hibernate GUI : Swing et JavaFX • Swing : JFrame, JPanel, JButton, etc. • MVC • callbacks pour les événements • JavaFX : nouvelle librairie destinée à remplacer Swing, dans Java SE depuis Java 8 • similaire à Swing, quelques améliorations, e.g., possibilité d’utiliser CSS et de décrire le layout statique dans un fichier XML Web : EJB et Spring • plusieurs framework pour les serveur web • Enterprise JavaBeans (EJB) et Spring les plus populaires • incluent la gestion de threads, connexions réseau, BD, transactions, MVC, testing Android • applications Android tournent dans une JVM sur le téléphone ou la tablette • informations de base dans un fichier “manifeste” XML • le layout d’un écran peut être statiquement décrit dans un fichier XML • sinon développement GUI “normal” (MVC, listeners, etc.) Expressions lambda • fonctions anonymes • ex : x -> x+42 • spécification des types possible mais pas nécessaire s’ils peuvent être inférés • peut décrire une instance de chaque interface avec une seule méthode Expressions lambda • Ex : ActionListener Expressions lambda • peut contenir des effets de bord : button.addActionListener(e -> System.out.println("Lambda")); • pareil pour Runnable ou Callable : executor.submit(() -> 42) • facilite un style de programmation fonctionnel (map, reduce, filter) Langages orientés objet • Java • C++ • JavaScript • Python • etc : C#, Objective-C, Swift, … C++ • comme Java : orienté objet, statiquement typé • sur-ensemble de C, peut donc utiliser toutes les librairies C • pas de garbage collection • choix de passage de paramètres par valeur, référence ou pointeur • différence du point de vue POO : héritage multiple C++ • changé considérablement avec les nouveaux standards C++11 et C++14 • ex : inférence de type auto x = 3.7; • ex : boucles foreach for(int &x : vec) x = 2*x; • ex : smart pointers shared_ptr<Object> p1 = make_shared<Object>(“foo"); • ex : expressions lambda JavaScript • malgré le nom, n’a rien à voir avec Java • nom officiel du standard : ECMAScript • normalement interprété par le navigateur • des interpréteurs standalone existent aussi (par exemple pour exécuter node.js) • dynamiquement typé • pas de classes, mais des prototypes JavaScript var foo = {one: 1, two: 2}; // bar.[[prototype]] = foo var bar = Object.create( foo ); bar.three = 3; bar.one; // 1 bar.two; // 2 bar.three; // 3 Python • langage orienté objet avec des classes • focus sur brévité et lisibilité • programmation fonctionnelle possible • REPL Python class Rectangle: def __init__(self, x, y): self.x = x self.y = y def area(self): return self.x * self.y Langages sur la JVM • Java (duh) • Scala • Jython, JRuby • Clojure Java Virtual Machine • machine virtuelle à pile d’opérandes • objets créés sur le tas • garbage collection pour le tas • fichiers .java sont compilés en fichiers .class • fichiers .class contiennent le Java bytecode que la JVM exécute Java Virtual Machine • 8 types numériques et 3 types de références (array, class, interface) • chaque appel à une méthode crée un stack frame avec les paramètres, les variables locales et la pile d’opérandes • types vérifiés statiquement • depuis Java 7 : appels dynamiques Java Virtual Machine • il est donc possible de générer du Java bytecode pour d’autres langages • avec l’ajout d’appels dynamiques même une plus grande classe de langages potentiels • intérêt : interaction avec toute l’API de Java, machine virtuelle très utilisée et stable Langages sur la JVM • Scala : orienté objet, statiquement typé, proche de Java, des aspects fonctionnels • Jython, JRuby : implémentations de Python et Ruby sur la JVM • Clojure : purement fonctionnel, dialecte de Lisp Clojure • réutilise les types numériques (+ Ratio) et strings de Java • 3 types de collections de base pour construire des structures de données : listes (et vecteurs), tableaux associatifs (key/value) et ensembles • dynamiquement typé : pas besoin de déclarer le type d’une valeur • toutes les données sont immuables Clojure • langage fonctionnel : les fonctions peuvent prendre en paramètre d’autres fonction et aussi retourner des fonctions • user=> (map inc '(1 2 3)) (2 3 4) • user=> (filter even? '(1 2 3 4)) (2 4) Clojure • presque tout code en Clojure est thread-safe par définition • commence à être beaucoup utilisé pour des programmes concurrents • en particulier pour la programmation web : ClojureScript qui compile Clojure à JavaScript • développement avec une REPL Conclusion • point fondamental de la POO : héritage • aspect “structure de données” d’objets : rajouter des champs • aspect comportemental d’objets : rajouter ou changer des méthodes ; attention à la cohérence du sous-type avec toutes les utilisations du sur-type (“Socrate est mortel”) • POO est très utilisée dans la pratique, y compris des applications concurrentes : attention à la synchronisation de l’accès