java, zimni semestr 2015 - d3s.mff.cuni.cz · java, zimní semestr 2015 3.11,2015 8 funkcionální...
TRANSCRIPT
Java, zimní semestr 20153.11,2015 1
JAVAJAVA
Anotace
Java, zimní semestr 20153.11,2015 2
AnotaceAnotace● (metadata)● od Java 5● umožňují přidat informace k elementům v programu
(ke třídám, metodám, atributům,...)– obecně je lze použít všude tam, kde lze napsat nějaký
modifikátor viditelnosti● zapisují se @JmenoAnotace● lze definovat vlastní
– určit, kde je lze napsat, jak používat,...● předdefinované anotace v balíku java.lang
– @Deprecated– @Override– @SuppressWarnings– ...
Java, zimní semestr 20153.11,2015 3
Předdefinované anotacePředdefinované anotace● @Deprecated
– označení API, které by se nemělo používat● náhrada za tag z dokumentačních komentářů
● @Override– označení, že metoda v potomku předefinovává
metodu z předka– pokud nic nepředefinovává => kompilátor odmítne
třídu přeložit● @SuppressWarnings
– zamezí vypisování varování při překladu– parametr – třída varování
● 2 třídy– unchecked – varovaní při „nevhodném“ používání
generických typů– deprecation – varování při použití „deprecated“ elementů
– př. @SuppressWarnings(“unchecked“) @SuppressWarnings({“unchecked“, “deprecation“})
Java, zimní semestr 20153.11,2015 4
JAVAJAVA
Lambda výrazy
Java, zimní semestr 20153.11,2015 5
MotivaceMotivace● obsluha událostí v GUI● implementace komparátoru● implementace vlákna● …
– běžně pomocí anonymní vnitřní třídy
interface Comparator<T> { int compare(T o1, T o2);} class Arrays {
... void sort(T[] a, Comparator<T> c);}
Arrays.sort(array, new Comparator<AClass> () { public int compare(AClass o1, AClass o2) { return o1.x - o2.x; }});
vždy interfaces jednou metodou
Java, zimní semestr 20153.11,2015 6
MotivaceMotivace● předchozí příklad pomocí lambda výrazů
● zjednodušenělambda výraz ~ blok kódu s parametry
● od Java 8
Arrays.sort(array, (o1, o2) -> o1.x - o2.x );
Java, zimní semestr 20153.11,2015 7
Příklady lambda výrazůPříklady lambda výrazů● (int x, int y) -> x + y
● (x, y) -> x - y
● () -> 42
● (String s) -> System.out.println(s)
● x -> 2 * x
● c -> { int s = c.size(); c.clear(); return s; }
Java, zimní semestr 20153.11,2015 8
Funkcionální interfaceFunkcionální interface● kde lze lambda výrazy použít?
tam, kde se očekává instance interfacu s jednou abstraktní metodou
= funkcionální interface
● lambda výraz je instance funkcionálního interfacu
● alelambda výraz neobsahuje informaci o tom, který funkcionální interface implementuje
Java, zimní semestr 20153.11,2015 9
Typ lambda výrazuTyp lambda výrazu● stejný lambda výraz lze přiřadit do různých interfaců
Runnable r = () -> {};AutoCloseable r = () -> {};
● lambda výrazy jsou objekty
Runnable r = () -> {}; Object o = r;
● alelambda výrazy nelze (přímo) přiřadit do typu Object
Object r = () -> {};
Java, zimní semestr 20153.11,2015 10
Funkcionální interfaceFunkcionální interface● @FunctionalInterface
– anotace– pro označení funkcionálního interface
● použití není nutné– podobně jako @Override
Java, zimní semestr 20153.11,2015 11
Reference na metodyReference na metody● String::valueOf
– reference na statickou metodu– ekvivalent: x -> String.valueOf(x)
● Object::toString– reference na nestatickou metodu– ekvivalent: x -> x.toString()
● x::toString– reference na metodu konkrétního objektu– ekvivalent: () -> x.toString()
● ArrayList::new– reference na konstruktor– ekvivalent: () -> new ArrayList<>()
Java, zimní semestr 20153.11,2015 12
Lambda výrazyLambda výrazy● lambda výrazy nepřidávají nový prostor (scope)
viditelnosti proměnných
Path first = Paths.get("/usr/bin");Comparator<String> comp = (first, second) ->
Integer.compare(first.length(), second.length());
● this v lambda výrazu odkazuje na this metody, ve které je výraz vytvořen
public class Application { public void doWork() { Runnable runner = () ->
{System.out.println(this.toString());}; }}
Java, zimní semestr 20153.11,2015 13
JAVAJAVA
Nástroje v JDK
Java, zimní semestr 20153.11,2015 14
NástrojeNástroje● javac● javadoc● jdb● javah● jconsole● ...
Java, zimní semestr 20153.11,2015 15
JAVAJAVA
javadoc
Java, zimní semestr 20153.11,2015 16
PřehledPřehled● nástroj na automatické generování dokumentace ze
zdrojových kódů● deklarace tříd atd. plus dokumentační komentáře
– dokumentace je přímo v kódu– snadno se udržuje aktualizovaná
● výstup – (implicitně) HTML stránky● dokumentační komentáře
/** komentar */– před popisovaný element– uvnitř – text + speciální tagy + html kód
● program javadoc– ve standardní distribuci– vygeneruje dokumentaci
Java, zimní semestr 20153.11,2015 17
KomentářeKomentáře● dokumentační komentáře těsně před popisovaný
element
/** Komentar ke tride */public class MyClass { /** Komentar k atributu */ public int a; /** Komentar k metode */ public void foo() { ... }}
Java, zimní semestr 20153.11,2015 18
KomentářeKomentáře● jinde jsou ignorovány (jako normální komentáře)
/** ignorovano */import java.util.*;
public class MyClass { void foo() { /** ignorovano */ }}
Java, zimní semestr 20153.11,2015 19
Víceřádkové komentářeVíceřádkové komentáře● komentáře typicky přes více řádků● úvodní mezery a hvězdička na dalších řádcích jsou
ignorovány● bez hvězdičky mezery nejsou ignorovány (od 1.3)
/** Tohle je viceradkovy komentar. * Uvodni mezery a hvezdicky * jsou ignorovany a odstraneny. */
/** Zde uvodni mezery ignorovany nejsou – chybi hvezdicka. */
Java, zimní semestr 20153.11,2015 20
Sekce komentářůSekce komentářů● dvě sekce v dokumentačních komentářích
– hlavní popis– sekce s tagy
● nejdřív je hlavní popis, pak sekce s tagy– pořadí sekcí nelze prohodit– sekce s tagy začíná prvním tagem (@neco)
/** Hlavni popis elementu. Stale hlavni * popis elementu * @see java.lang.Object */
● komentáře můžou mít pouze jednu sekci
Java, zimní semestr 20153.11,2015 21
Druhy tagůDruhy tagů● "block tags"
– @tag– samostatné tagy– můžou stát jen na začátku řádku (úvodní mezery a
hvězdička ignorovány)● znak @ jinde než na začátku řádku je normální znak
● "in-line tags"– {@tag}– můžou stát kdekoliv v textu– i hlavním popisu
@deprecated As of JDK 1.1, replaced by {@link #setBounds(int,int,int,int)}
Java, zimní semestr 20153.11,2015 22
KomentářeKomentáře● první věta komentáře = shrnutí
– věta končí první tečkou následovanou bílým znakem (nebo prvním tagem)
– zobrazena ● v přehledu členů třídy (metody, atributy)● v krátkém popisu třídy
● jeden komentář k více atributům/** Komentar patri k obema atributum */public int x, y;
Java, zimní semestr 20153.11,2015 23
HTMLHTML● text komentářů – HTML● lze používat HTML tagy
/** Tohle je <b>dokumentacni</b> * komentar */
● znaky < > & zapisovat jako v HTML– < ... <– > ... >– & ... &
● není vhodné používat některé tagy– např. hlavičky <h1> <h2>– naruší strukturu vygenerované dokumentace
Java, zimní semestr 20153.11,2015 24
Dědění komentářůDědění komentářů● pokud není komentář definován, dědí se od
nadřazené třídy– u předefinovaných metod– u implementovaných metod z interfaců
● dědí se ta část komentáře, která není definována– platí od 1.4– do 1.3 – přítomnost dokumentačního komentáře
zamezila dědění z předků● explicitní dědění {@inheritDoc}
Java, zimní semestr 20153.11,2015 25
Popis balíkuPopis balíku● dokumentační komentář k balíku● soubor package.html● ve stejném adresáři jako třídy● obsahuje HTML stránku● do dokumentace se vloží vše mezi <body> a </body>● píše se bez /** ... */● první věta – krátký popis balíku
● popis skupiny tříd● soubor overview.html● jako package.html
Java, zimní semestr 20153.11,2015 26
TagyTagy
Tag Tag1.0 1.0
@{code} 1.5 1.01.3 1.21.0 1.21.0 1.21.4 1.1
{@link} 1.2 1.21.4 {@value} 1.4
{@literal} 1.5 1.01.0
od JDK od JDK@author @return
@see@{docRoot} @serial@deprecated @serialData@exception @serialField{@inheritDoc} @since
@throws{@linkplain}
@version@param
Java, zimní semestr 20153.11,2015 27
Tagy u metodTagy u metod
/** Hlavni popis. * @param p1 popis parametru p1 * @param p2 popis parametru p2 * @throws IOException kdy je vyhozena * @throws MyException kdy je vyhozena * @returns co vraci */int foo(int p1, long p2) throws IOException, MyException;
Java, zimní semestr 20153.11,2015 28
Další tagyDalší tagy● @since text
– lze použít všude– význam: od jaké verze softwaru daný element existuje– @since 1.4
● @exception– to samé jako @throws
● @author jmeno– jméno tvůrce– použití u třídy, balíku a v přehledu
Java, zimní semestr 20153.11,2015 29
Další tagyDalší tagy● @see reference
– "See also" hlavička ve vygenerované dokumentaci– tři formáty– @see "retezec"
● @see "The Java language specification"– @see <a href="URL#value">label</a>– @see package.class#member label
● @see String#equals(Object) equals● @see java.io.File#exists() exists
● {@link package.class#member label}– reference v textu– podobné jako @see
Java, zimní semestr 20153.11,2015 30
Další tagyDalší tagy● {@linkplain package.class#member label}
– stejné jako {@link ...}– použije se stejný font jako pro text
● pro {@link ...} se použije jiný font● @deprecated text
– označuje API, které by se už nemělo používat (přetrvává z předchozích verzí)
– text – vysvětlení proč– zpracovává ho i překladač
● varování při použití takového API– od 1.5 – anotace @deprecated
● {@docRoot}– relativní cesta ke kořenovému adresáři vygenerované
dokumentace
Java, zimní semestr 20153.11,2015 31
Další tagyDalší tagy● {@literal text}
– text se nebude nijak interpretovat– {@literal a<b>c}
● v dokumentaci bude a<b>c● <b> se nebude interpretovat jako tag
● {@code text}– to samé jako <code>{@literal text}</code>
Java, zimní semestr 20153.11,2015 32
javadocjavadoc● vygenerování dokumentace – javadoc
– součást standardní distribuce– spouštění
javadoc [parametry] [baliky] [zdrojove_soubory] [-subpackages pkg1:pkg2:...]
Java, zimní semestr 20153.11,2015 33
Parametry pro javadocParametry pro javadoc● -overview cesta/soubor
– jiné umístění pro soubor overview.html● -public
– dokumentace bude obsahovat pouze public elementy● -protected
– dokumentace bude obsahovat public a protected elementy
– implicitní chování● -package
– dokumentace bude obsahovat public, protected a elementy bez označení
● -private– dokumentace bude obsahovat všechny elementy
Java, zimní semestr 20153.11,2015 34
Parametry pro javadocParametry pro javadoc● -doclet trida
– doclet generuje dokumentaci– imlicitní doclet generuje HTML
● -source 1.4– pokud se používají assertions (pro JDK 1.4)
● -sourcepath seznam_cest– kde se mají hledat zdrojové soubory
● -verbose -quiet– uroveň výpisů při generování
● -locale jazyk_země_varianta– musí být jako první parametr
● -encoding kodovani– kódování zdrojových souborů
Java, zimní semestr 20153.11,2015 35
Parametry pro javadocParametry pro javadoc● -d cesta
– kam vygenerovat dokumentaci● -version
– zahrnout tag @version● -author
– zahrnout tag @author● -windowtitle text● -doctitle text● -header text
– bude na začátku každé stránky● -footer text
– bude na konci každé stránky● -nodeprecated● -nosince
Java, zimní semestr 20153.11,2015 36
JAVAJAVA
ANT
Java, zimní semestr 20153.11,2015 37
PřehledPřehled● http://ant.apache.org/● nástroj (nejen) na překlad java programů● obdoba make● napsán v Javě● rozšiřitelný
– přidáváním dalších tříd● vstupní soubor (buildfile)
– (obdoba makefile u make)– XML
● NetBeans interně Ant používají pro překlad, spouštění,... projektů
Java, zimní semestr 20153.11,2015 38
BuildfileBuildfile● implicitní jméno build.xml● obsahuje jeden project● a alespoň jeden target
<?xml version="1.0" encoding="us-ascii" ?><project ...> <target ...> ... </target> <target ...> ... </target></project>
Java, zimní semestr 20153.11,2015 39
ProjectProject● atributy
– name● jméno projektu
– default● implicitní target, který se bude provádět, pokud nebude
žádný explicitně zadán● povinný parametr
– basedir● adresář, od něhož budou všechny cesty v souboru
odvozeny● volitelný element <description>
– popis projektu
<project name="Projekt" default="compile" basedir=".">
<description>Dlouhy popis projektu</description>
Java, zimní semestr 20153.11,2015 40
TargetTarget● posloupnost činností (task), které se mají provést● může záviset na jiných targets
– provede se až po těch, na kterých závisí● atributy
– name ● jméno, povinné
– depends● seznam targetů, na kterých závisí
– description● krátký popis
– if● jméno property, která musí být nastavena
– unless● jméno property, která nesmí být nastavena
Java, zimní semestr 20153.11,2015 41
TargetTarget<target name="compile" depends="init" description="Prelozi aplikaci"> ....</target>
Java, zimní semestr 20153.11,2015 42
TaskTask● kód, který může být vykonán● různý počet parametrů
– podle druhu● vestavěné● volitelné● vlastní
<jmeno atr1="hodnota" atr2="hodnota" .../>
<javac srcdir="..." destdir="..."/>
Java, zimní semestr 20153.11,2015 43
PropertyProperty● jméno a hodnota● jména – rozlišování velikosti písmen● získání obsahu property - ${property}● vestavěné property
– basedir– ant.file– ant.version– ant.project.name– ant.java.version– systémové properties Javy
● vlastní property– <property name="jmeno" .... />
Java, zimní semestr 20153.11,2015 44
PříkladPříklad<?xml version='1.0' encoding='us-ascii'?><project basedir="." default="compile" name="Project"> <description>Project description</description>
<property name="src" location="src"/> <property name="classes" location="classes"/> <target name="init"> <mkdir dir="${classes}"/> </target>
<target name="compile" depends="init" description="Compile">
<javac debug="true" destdir="${classes}" srcdir="${src}" includes="**/*.java" classpath="${src}" /> </target>
<!-- pokracovani -->
Java, zimní semestr 20153.11,2015 45
PříkladPříklad <!-- pokracovani -->
<target name="run" depends="init,compile" description="Execute"> <java fork="true" classname="Main" classpath="${classes}" /> </target>
</project>
Java, zimní semestr 20153.11,2015 46
SpouštěníSpouštění● ant [parametry] [target [target2 ... ]]
● parametry-projecthelp, -p
● napověda projektu● popis projektu + popis task
-propertyfile <soubor>● definuje property ze zadaného souboru
-D<property>=<name>● definice property
-buildfile <soubor>-file <soubor>-f <soubor>
● buildfile
Java, zimní semestr 20153.11,2015 47
Task javacTask javac● spouští překladač Javy● překládá pouze ty soubory, které jsou potřeba
– k souboru .java není .class nebo je starší– pozor!
● určuje pouze podle jmen souborů● tj. neví o vnitřních třídách apod.
● atributy– srcdir
● adresář s .java soubory● povinný
– destdir● kam ukládat .class soubory
– classpath● CLASSPATH
Java, zimní semestr 20153.11,2015 48
Task javacTask javac● atributy
– encoding● kódování
– source● -source parametr pro javac
– compiler● jaký překladač pro Javu se má použít
– fork● true nebo false (implicitně false)● spustit překladač ve stejne JVM jako ant nebo v nové
● srcdir, classpath (a další) můžou být nahrazeny vnořenými elementy <src>, <classpath> (a další)
Java, zimní semestr 20153.11,2015 49
Task javaTask java● spustí Java aplikaci● atributy
– classname● třída s metodou main
– jar● jar-soubor ke spuštění
– povinně buď classname nebo jar– classpath– fork
● spustit aplikaci v nové JVM● vnořené elementy
– <arg>● parametry příkazové řádky
Java, zimní semestr 20153.11,2015 50
Task propertyTask property● nastaví property na danou hodnotu● nelze měnit jejich hodnotu● atributy
– name● jméno property
– value● hodnota property
– location● absolutní cesta zadaného souboru
– file● soubor, ze kterého se mají načíst property
– url● url, ze kterého se mají načíst property
Java, zimní semestr 20153.11,2015 51
Task propertyTask property● příklady
<property name="src" location="src"/><property name="foo.dist" value="dist"/><property file="foo.properties"/><property url="http://...." />
Java, zimní semestr 20153.11,2015 52
Task javadocTask javadoc● vytvoří javadoc dokumentaci● atributy
– sourcepath – adresáře se zdrojáky– sourcefiles – přímo vyjmenované zdrojáky– packagenames – pro které balíčku vytvářet– destdir – do jakého adresáře generovat– public, protected,package, private – pro
které elementy se má dokumentace generovat– author – zahrnout tag autor– version – zahrnou tag version– … mnoho dalších
Java, zimní semestr 20153.11,2015 53
OstatníOstatní● mnoho dalších tasků
– delete● maže soubory/adresáře
– move● přesun/přejmenování souborů
– mkdir● vytoření adresáře
– copy● kopírování
– echo● vypíše text na standardní výstup
Java, zimní semestr 20153.11,2015
JAVAJAVA
Maven
Java, zimní semestr 20153.11,2015
PřehledPřehled● http://maven.apache.org/● nástroj pro správu projektů
– „zjednodušeně“ si lze představit jako rozšíření Antu● ale není to rozšíření Antu
● poskytuje– správu závislostí– usnadnění „překládání“ (build) projektů– používání „best practices“– přidávání nových modulů– …
Java, zimní semestr 20153.11,2015
PoužíváníPoužívání● vygenerování struktury projektu
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.mycompany.app -DartifactId=my-app
– archetype ~ šablona projektu
– vygeneruje následující strukturu
Java, zimní semestr 20153.11,2015
Struktura projektuStruktura projektu
my-app|-- pom.xml`-- src |-- main | `-- java | `-- com | `-- mycompany | `-- app | `-- App.java `-- test `-- java `-- com `-- mycompany `-- app `-- AppTest.java
Java, zimní semestr 20153.11,2015
POM – Project Object ModelPOM – Project Object Model● „definice“ projektu<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>Maven Quick Start Archetype</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies></project>
Java, zimní semestr 20153.11,2015
Životní cyklus „buildu“Životní cyklus „buildu“● mvn „fáze“
– vždy se provedou i předchozí fáze
1. process-resources 2. compile 3. process-test-resources 4. test-compile 5. test 6. package 7. install 8. deploy
Java, zimní semestr 20153.11,2015 60Tato prezentace podléhá licenci Creative Commons Uveďte autora-Neužívejte komerčně 4.0 Mezinárodní License.
Verze prezentace J05.cz.2015.01