Java EPITECH 2012 sebastien@migniot.com
Java 1 - Introduction Rappel : Historique Machine virtuelle Plateformes et marché Tour de J2SE Tour de J2EE
Java 2 - Technique Les API Les librairies Best practices Exemples
Java 2 - Technique Les API Les librairies Best practices Exemples
Les API Les API que vous utiliserez le plus. Performantes Collections/JSTL Evidentes Input/Math Riches
Les API Collections Input / Output Threading Network Serialization Reflection XML JDBC ...
Les API java.util.Collection http://fr.wikipedia.org/wiki/Collection D'une manière générale, une collection est un rassemblement d'objets.
Collections // 5. Soustraction trajet.removeAll(villesViolentes); // 1. Un tableau String[] numbers = new String[] { "one", "two", "three", "one" }; // 2. Une liste List<String> list = Arrays.asList(numbers); // 3. Unicité Set<String> set = new HashSet<String>(list); // contient { "one", "two", "three" } // 4. Addition List<City> trajet = new ArrayList<City>(); trajet.addAll(villes1); trajet.addAll(villes2); // 5. Soustraction trajet.removeAll(villesViolentes); // 6. Union Set<City> visitees = new HashSet<City>(); visitees.addAll(villes1); visitees.addAll(villes2); // 7. Intersection Set<City> villesFleuries = new HashSet<City>(Arrays.asList(new City[] { new City("Colmar"), new City("Mulhouse"), new City("Lille") })); visitees.retainAll(villesFleuries); // contient les villes visitees et fleuries
Les API java.io http://fr.wikipedia.org/wiki/Machine_de_Turing Un ruban divisé en cases consécutives – permet l'entrée et la sortie d'information.
Input Output FileInputStream input = null; try { input = new FileInputStream(file); String content = readFile(input); logger.info(content); } finally { if (input != null) { try { input.close(); } catch (IOException ioe) { // Harmless logger.throwing("FooBar", "foo", ioe); logger.fine("Can't close file reader properly"); }
Les API java.util.conccurent http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html De toute évidence, une rupture du continuum espace- temps a produit une nouvelle séquence chrono- évènementielle entraînant l'émergence de cette réalité alternative
Conccurence LOGGER .info("Starting Master.run()"); BlockingQueue<Runnable> queue = new LinkedBlockingDeque<Runnable>(); ExecutorService service = new ThreadPoolExecutor(MINIMUM_THREADS, MAXIMUM_THREADS, KEEP_ALIVE, KEEP_ALIVE_UNIT, queue); Map<String, Future<?>> calls = new HashMap<String, Future<?>>(); for (String pack : packs) { calls.put(pack, service.submit(new Slave(pack).getRunnable())); LOGGER.info("Submitted pack = [" + pack + "]"); } LOGGER.info(">> Waiting for pack = [" + pack + "]"); try { calls.get(pack).get(); } catch (InterruptedException e) { LOGGER.severe(e.toString()); } catch (ExecutionException e) { LOGGER.info("<< Waited for pack = [" + pack + "]"); service.shutdown(); LOGGER.info("Done Master.run()");
Les API java.net.Socket http://download.oracle.com/javase/6/docs/api/java/net/Socket.html A socket is an endpoint for communication between two machines. Exemples joints.
Les API java.io.ObjectOutputStream http://download.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html An ObjectOutputStream writes primitive data types and graphs of Java objects to an OutputStream.
Les API java.lang.reflect http://download.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html La classe Class n'a pas de constructeur, mais la JVM n'est qu'un ClassLoader Bootclasspath
Les API javax.xml Faites du SAX .. ou du StAX http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/SAXParserFactory.html Troll (wikipedia) Un troll est une action de nature à créer une polémique en provoquant les participants d’un espace de discussion. Le mot désigne également un utilisateur qui a recours à ce type d’action Faites du SAX .. ou du StAX
XML InputStream stream = openUrl(source.getUrl()); SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); parser.parse(stream, new DefaultHandler() { private boolean insideItem = false; private boolean captureText = false; private StringBuilder texte = null; private String linkHref = null; private Map<String, String> textes; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (ITEMS.contains(localName)) { textes = new HashMap<String, String>(); insideItem = true; } if (CAPTURED.contains(localName)) { texte = new StringBuilder(); captureText = true; if ("link".equals(localName)) { linkHref = attributes.getValue("href"); super.startElement(uri, localName, qName, attributes); // …
Les API java.sql.Connection PreparedStatement statement = connection http://download.oracle.com/javase/6/docs/api/java/sql/Connection.html Write once, run anywhere ^^ PreparedStatement statement = connection .prepareStatement("SELECT * FROM PERSON WHERE LASTVIEW < ?"); statement.setDate(1, yesterday); ResultSet result = statement.executeQuery();
Java 2 - Technique Les API Les librairies Best practices Exemples
Les librairies Les librairies classiques Juste évidentes Apache commons Les plus utilisées Spring, Hibernate
Les librairies Spring Hibernate Apache XStream JUnit AspectJ CGlib
Les librairies - Spring Un conteneur IoC Un encapsulateur Transactionnel Sécurité MVC Vers OSGI .. Partiellement commercial
Les librairies - Hibernate SGBDO Persiste Automatiquement En cycle Transactionnellement Cascading CGlib Vers EJB3 .. Partiellement JBoss
Les librairies - Apache Commons lang Commons IO Commons Configuration Commons Net Struts ..
Les librairies - XStream Simple Résistant A good job ..
Les librairies - JUnit Deux fois plus de code ? Troll Tester ? Non, j'écris tout d'une traite, et parfait ! Métaphore du grimpeur et du python
Les librairies - JUnit Coder les yeux fermés Construire des exemples Documenter les cas non passant L'application a demandé une carte de trop parce que l'utilisateur Joe a triché sur le réseau.
Les librairies - AspectJ Librairie avancée Injection de code Logging Sécurité Transactionnalité Profiling
Les librairies - CGlib CGLib, BCEL, ASM Injection de code Runtime injection Tissage de proxy Persistance Mock
Java 2 - Technique Les API Les librairies Best practices Exemples
Best practices The cathedral and the bazaar La roue est inventée Depuis les années 70 Arts martiaux Reproduire avant d'inventer
Best practices Javadoc Logging Exceptions JUnit XP, IoC, Concern Run, Right, Fast, Small Singleton (yuk) Observer Visitor Test driven
Best practices - Javadoc Vous n'utilisez que des librairies connues et bien documentées Faîtes de même Respectez-vous
Best practices - Javadoc 70% du code Exemple /** * Stream the proxy response body to the user agent response output stream. * * SubClasses SHOULD override this method both for metadata gathering and * for stream backup. * @param request * The user agent request * @param response * The user agent response * @return An output stream * @throws IOException * Upon streaming failure */
Best practices - Logging Plus jamais System.out.println(..) Utiliser logger.info(..) Utiliser [value] et overrider toString(..) /** * Run. * * @param packs * The packs * @throws InterruptedException * Upon {@link Thread#sleep(long)} failure */ public void perform() throws InterruptedException { LOGGER.info("Starting Master.perform() for data = [" + data + "]"); new Slave(data).run(); LOGGER.info("Done Master.perform() for data = [" + data + "]"); }
Best practices - Exception Ne pas hésiter à relancer les exceptions A minima, utiliser les finally Un cas non passant = un destinataire Ex: Formattage de nombre « On ne propage pas un bug » try { // At this point, the client ouput stream is opened streamResponse(request, response, proxyRequest, proxyResponse); } finally { // The proxy socket must be closed // The client input stream is closed // The client ouput stream must be closed closeQuietly(response.getOutputStream(), proxyConnection, proxySocket); }
Best practices - JUnit Coder les tests avant la méthode http://www.extremeprogramming.org/rules/testfirst.html Coder les tests avant la méthode Capitaliser pour durer Un test est un exemple de bonne utilisation de votre code Ex: core.CheckListener .checked(Category, String)
Best practices - IoC Renier les Singleton et variables globales Si MyClass.foo(..) utilise Globals.VAR, Injecter un argument supplémentaire ou Injecter un membre de classe supplémentaire Ex: Les connections SQL et le multi-threading
Best practices – Design Patterns Depuis les années 70, les ordinateurs doublent de vitesse processeur tous les ans, doublent de capacité mémoire, quadruplent de capacité de communication La vitesse des logiciels diminue de moitié tous les ans Ne pas réinventer la roue – ou uniquement après l'avoir apprise
Best practices – Design Patterns Observer : dès qu'on voit le mot clé Listener Ex: Barre de progression
Best practices – Design Patterns Visitor : de multiples explorations
Anti-patterns Vous en rencontrerez. Inventoriez-les. Elles vous disent dans quelle direction est l'autre .. la bonne solution.
Exemples Conccurency Collections Unit testing Hibernate Aspect Profiling