JAVA
Anotace
Java, zimní semestr 2016 2.11,2016
1
Anotace ● ● ●
(metadata) od Java 5 umožňují přidat informace k elementům v programu (ke třídám, metodám, atributům,...) –
● ●
zapisují se @JmenoAnotace lze definovat vlastní –
●
obecně je lze použít všude tam, kde lze napsat nějaký modifikátor viditelnosti určit, kde je lze napsat, jak používat,...
předdefinované anotace v balíku java.lang – – – –
@Deprecated @Override @SuppressWarnings ...
Java, zimní semestr 2016 2.11,2016
2
Předdefinované anotace ●
@Deprecated –
označení API, které by se nemělo používat ●
– ●
náhrada za tag z dokumentačních komentářů
při použití => varování při překladu
@Override – – –
označení, že metoda předefinovává metodu z předka pokud nic nepředefinovává => kompilátor odmítne třídu přeložit použití je volitelné (nicméně silně doporučené)
class class AA {{ public public void void foo() foo() }} class class BB extends extends AA {{ @Override @Override public public void void foo() foo() }} Java, zimní semestr 2016 2.11,2016
{} {}
{} {}
interface class interface Ice Ice {{ class DD {{ void public void foo() foo() {} {} public void void foo() foo() {} {} }} }} class class CC implements implements Ice Ice {{ class class EE extends extends DD {{ @Override @Override @Override @Override public public public void void foo() foo() {} {} public void void bar() bar() {} {} }} }} 3
Předdefinované anotace ●
@SuppressWarnings – –
zamezí vypisování varování při překladu parametr – třída varování ● ●
podporované třídy jsou závislé na překladači vždy dostupné třídy varování – –
–
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 2016 2.11,2016
4
JAVA
Lambda výrazy
Java, zimní semestr 2016 2.11,2016
5
Motivace ● ● ● ●
obsluha událostí v GUI implementace komparátoru implementace vlákna … –
vždy interface s jednou metodou
běžně pomocí anonymní vnitřní třídy
interface Comparator
{ int compare(T o1, T o2); } class Arrays { ... void sort(T[] a, Comparator c); } Arrays.sort(array, new Comparator () { public int compare(AClass o1, AClass o2) { return o1.x - o2.x; Java,}}); zimní semestr 2016 6 2.11,2016
Motivace ●
předchozí příklad pomocí lambda výrazů
Arrays.sort(array, (o1, o2) -> o1.x - o2.x );
●
●
zjednodušeně: lambda výraz ~ blok kódu s parametry od Java 8
Java, zimní semestr 2016 2.11,2016
7
Funkcioná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 ale lambda výraz neobsahuje informaci o tom, který funkcionální interface implementuje
Java, zimní semestr 2016 2.11,2016
8
Typ 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;
●
ale lambda výrazy nelze (přímo) přiřadit do typu Object Object r = () -> {};
Java, zimní semestr 2016 2.11,2016
9
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 2016 2.11,2016
10
Funkcionální interface ●
@FunctionalInterface – –
anotace pro označení funkcionálního interface ●
použití není nutné –
podobně jako @Override
Java, zimní semestr 2016 2.11,2016
11
Reference na metody ●
String::valueOf – –
●
Object::toString – –
●
reference na nestatickou metodu ekvivalent: x -> x.toString()
x::toString – –
●
reference na statickou metodu ekvivalent: x -> String.valueOf(x)
reference na metodu konkrétního objektu ekvivalent: () -> x.toString()
ArrayList::new – –
reference na konstruktor ekvivalent: () -> new ArrayList<>()
Java, zimní semestr 2016 2.11,2016
12
Lambda 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 2016 2.11,2016
13
Překlad lambda výrazů public class AClass { ... public void foo(AClass[] array) { Arrays.sort(array, new Comparator () { public int compare(AClass o1, AClass o2) { return o1.x - o2.x; javac javac AClass.java AClass.java }}); } => => AClass.class AClass.class } [email protected] [email protected] ●
ale public class AClass { ... public void foo(AClass[] array) { Arrays.sort(array, (o1, o2) -> o1.x - o2.x); } javac javac AClass.java AClass.java } => =>
Java, zimní semestr 2016 2.11,2016
AClass.class AClass.class 14
JAVA
Nástroje v JDK
Java, zimní semestr 2016 2.11,2016
15
Nástroje ● ● ● ● ● ●
javac javadoc jdb javah jconsole ...
Java, zimní semestr 2016 2.11,2016
16
JAVA
javadoc
Java, zimní semestr 2016 2.11,2016
17
Př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 2016 2.11,2016
18
Komentář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 2016 2.11,2016
19
Komentáře ●
jinde jsou ignorovány (jako normální komentáře) /** ignorovano */ import java.util.*; public class MyClass { void foo() { /** ignorovano */ } }
Java, zimní semestr 2016 2.11,2016
20
Ví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 2016 2.11,2016
21
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 2016 2.11,2016
22
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 2016 2.11,2016
23
Komentář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 2016 2.11,2016
24
HTML ● ●
text komentářů – HTML lze používat HTML tagy /** Tohle je dokumentacni * komentar */
●
znaky < > & zapisovat jako v HTML – – –
●
< > &
... ... ...
< > &
není vhodné používat některé tagy – –
např. hlavičky naruší strukturu vygenerované dokumentace
Java, zimní semestr 2016 2.11,2016
25
Dědění komentářů ●
pokud není komentář definován, dědí se od nadřazené třídy – –
●
dědí se ta část komentáře, která není definována – –
●
u předefinovaných metod u implementovaných metod z interfaců
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 2016 2.11,2016
26
Popis 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 a 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 2016 2.11,2016
27
Tagy Tag od JDK @author 1.0 @{code} 1.5 @{docRoot} 1.3 @deprecated 1.0 @exception 1.0 {@inheritDoc} 1.4 {@link} 1.2 {@linkplain} 1.4 {@literal} 1.5 @param 1.0
Java, zimní semestr 2016 2.11,2016
Tag @return @see @serial @serialData @serialField @since @throws {@value} @version
od JDK 1.0 1.0 1.2 1.2 1.2 1.1 1.2 1.4 1.0
28
Tagy 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 2016 2.11,2016
29
Další tagy ●
@since text – – –
●
@exception –
●
lze použít všude význam: od jaké verze softwaru daný element existuje @since 1.4 to samé jako @throws
@author jmeno – –
jméno tvůrce použití u třídy, balíku a v přehledu
Java, zimní semestr 2016 2.11,2016
30
Další tagy ●
@see reference – – –
"See also" hlavička ve vygenerované dokumentaci tři formáty @see "retezec" ●
– –
@see label @see package.class#member label ● ●
●
@see "The Java language specification" @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 2016 2.11,2016
31
Další tagy ●
{@linkplain package.class#member label} – –
stejné jako {@link ...} použije se stejný font jako pro text ●
●
@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č ●
– ●
pro {@link ...} se použije jiný font
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 2016 2.11,2016
32
Další tagy ●
{@literal text} – –
text se nebude nijak interpretovat {@literal ac} ● ●
●
v dokumentaci bude ac se nebude interpretovat jako tag
{@code text} –
to samé jako {@literal text}
Java, zimní semestr 2016 2.11,2016
33
javadoc ●
vygenerování dokumentace – javadoc – –
součást standardní distribuce spouštění
javadoc [parametry] [baliky] [zdrojove_soubory] [-subpackages pkg1:pkg2:...]
Java, zimní semestr 2016 2.11,2016
34
Parametry pro javadoc ●
-overview cesta/soubor –
●
-public –
●
–
dokumentace bude obsahovat public a protected elementy implicitní chování
-package –
●
dokumentace bude obsahovat pouze public elementy
-protected –
●
jiné umístění pro soubor overview.html
dokumentace bude obsahovat public, protected a elementy bez označení
-private –
dokumentace bude obsahovat všechny elementy
Java, zimní semestr 2016 2.11,2016
35
Parametry pro javadoc ●
-doclet trida – –
●
-source 1.4 –
●
-quiet
uroveň výpisů při generování
-locale jazyk_země_varianta –
●
kde se mají hledat zdrojové soubory
-verbose –
●
pokud se používají assertions (pro JDK 1.4)
-sourcepath seznam_cest –
●
doclet generuje dokumentaci imlicitní doclet generuje HTML
musí být jako první parametr
-encoding kodovani –
kódování zdrojových souborů
Java, zimní semestr 2016 2.11,2016
36
Parametry pro javadoc ●
-d cesta –
●
-version –
●
● ●
●
bude na začátku každé stránky
-footer text –
●
zahrnout tag @author
-windowtitle text -doctitle text -header text –
●
zahrnout tag @version
-author –
●
kam vygenerovat dokumentaci
bude na konci každé stránky
-nodeprecated -nosince
Java, zimní semestr 2016 2.11,2016
37
JAVA
ANT
Java, zimní semestr 2016 2.11,2016
38
Přehled ● ● ● ● ●
http://ant.apache.org/ nástroj (nejen) na překlad java programů obdoba make napsán v Javě rozšiřitelný –
●
vstupní soubor (buildfile) – –
●
přidáváním dalších tříd
(obdoba makefile u make) XML
NetBeans interně Ant používají pro překlad, spouštění,... projektů
Java, zimní semestr 2016 2.11,2016
39
Buildfile ● ● ●
implicitní jméno build.xml obsahuje jeden project a alespoň jeden target <project ...> ... ...
Java, zimní semestr 2016 2.11,2016
40
Project ●
atributy –
name ●
–
default ●
●
–
implicitní target, který se bude provádět, pokud nebude žádný explicitně zadán povinný parametr
basedir ●
●
jméno projektu
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 Java, zimní semestr 2016 2.11,2016
41
Target ● ●
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 ●
–
depends ●
– – –
jméno, povinné seznam targetů, na kterých závisí
description ●
krátký popis
●
jméno property, která musí být nastavena
if unless ●
jméno property, která nesmí být nastavena
Java, zimní semestr 2016 2.11,2016
42
Target ....
Java, zimní semestr 2016 2.11,2016
43
Task ● ●
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 2016 2.11,2016
44
Property ● ● ● ●
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 2016 2.11,2016
45
Příklad <project basedir="." default="compile" name="Project"> <description>Project description <property name="src" location="src"/> <property name="classes" location="classes"/> <mkdir dir="${classes}"/> <javac debug="true" destdir="${classes}" srcdir="${src}" includes="**/*.java" classpath="${src}" /> Java, zimní semestr 2016 2.11,2016
46
Příklad <java fork="true" classname="Main" classpath="${classes}" />
Java, zimní semestr 2016 2.11,2016
47
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>= ●
definice property
-buildfile <soubor> -file <soubor> -f <soubor> ●
buildfile
Java, zimní semestr 2016 2.11,2016
48
Task 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 ● ●
–
destdir ●
–
adresář s .java soubory povinný kam ukládat .class soubory
classpath ●
CLASSPATH
Java, zimní semestr 2016 2.11,2016
49
Task javac ●
atributy –
encoding ●
–
source ●
–
jaký překladač pro Javu se má použít
fork ● ●
●
-source parametr pro javac
compiler ●
–
kódování
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>, (a další)
Java, zimní semestr 2016 2.11,2016
50
Task java ● ●
spustí Java aplikaci atributy –
classname ●
–
jar ●
– – –
jar-soubor ke spuštění
povinně buď classname nebo jar classpath fork ●
●
třída s metodou main
spustit aplikaci v nové JVM
vnořené elementy –
<arg> ●
parametry příkazové řádky
Java, zimní semestr 2016 2.11,2016
51
Task property ● ● ●
nastaví property na danou hodnotu nelze měnit jejich hodnotu atributy –
name ●
–
value ●
–
absolutní cesta zadaného souboru
file ●
–
hodnota property
location ●
–
jméno property
soubor, ze kterého se mají načíst property
url ●
url, ze kterého se mají načíst property
Java, zimní semestr 2016 2.11,2016
52
Task property ●
příklady <property <property <property <property
Java, zimní semestr 2016 2.11,2016
name="src" location="src"/> name="foo.dist" value="dist"/> file="foo.properties"/> url="http://...." />
53
Task 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 2016 2.11,2016
54
Ostatní ●
mnoho dalších tasků –
delete ●
–
move ●
–
vytoření adresáře
copy ●
–
přesun/přejmenování souborů
mkdir ●
–
maže soubory/adresáře
kopírování
echo ●
vypíše text na standardní výstup
Java, zimní semestr 2016 2.11,2016
55
JAVA
Maven
Java, zimní semestr 2016 2.11,2016
Př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 2016 2.11,2016
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 2016 2.11,2016
Struktura projektu my-app |-- pom.xml `-- src |-- main | `-- java | `-- com | `-- mycompany | `-- app | `-- App.java `-- test `-- java `-- com `-- mycompany `-- app `-- AppTest.java Java, zimní semestr 2016 2.11,2016
POM – 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 com.mycompany.app <artifactId>my-app <packaging>jar 1.0-SNAPSHOT Maven Quick Start Archetype http://maven.apache.org <dependencies> <dependency> junit <artifactId>junit 3.8.1 <scope>test Java, zimní semestr 2016 2.11,2016
Ž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 2016 2.11,2016
Verze prezentace Java, zimní semestr 2016 J05.cz.2016.02 2.11,2016 Tato prezentace podléhá licenci Creative Commons Uveďte autora-Neužívejte komerčně 4.0 Mezinárodní License. 62