Programarea cursurilor de bază în Java - Descărcare gratuită PDF
Adăugări la cartea Dietmar Ratz, Jens Scheffler, Detlef Seese, Jan Wiesenberger Programarea cursurilor de bază în Java

Cuprins I Teorie. 11 1 Șiruri pentru utilizatori avansați. 13 1.1 Expresii regulate. 13 1.2 Un exemplu concret. 14 1.3 Înlocuirea textului. 16 1.4 Rezumat. 17 2 Adnotări în Java. 19 2.1 Adnotări standard în SDK-ul Java. 19 2.1.1 Adnotare DieS @ Override. 21 2.1.2 DieS @ Adnotare depreciată. 22 2.1.3 Adnotarea DieS @ SuppressWarnings. 24 2.2 Adnotări „Do-it-yourself”. 28 2.2.1 CoDo: Documentare cod folosind adnotări. 28 2.2.2 Scriem noi adnotări. 29 2.2.3 Evaluarea adnotărilor. 32 2.3 Rezumat. 36 3 JUnit sau arta de a scrie cod fără erori. 37 3.1 Afirmații pentru utilizatori avansați. 38 3.2 Teste unitare. 40 3.3 Adnotări și JUnit. 45 3.4 Cele mai bune practici. 46 3.5 Rezumat. 48 4 mostre de proiectare. 49 4.1 Ce sunt tiparele de proiectare. 49 4.2 Modelul de observator. 51 4.2.1 Ideea de bază. 51 4.2.2 Modelul obiectului. 51 4.2.3 Exemplu de implementare. 52 4.2.3.1 Lucrul cu un singur observator. 52 4.2.3.2 Lucrul cu mai mulți observatori. 55
4 Cuprins 4.2.4 Variații ale modelului. 60 4.2.5 Rezumat. 61 4.2.6 Exerciții. 61 4.3 Modelul compozit. 62 4.3.1 Ideea de bază. 62 4.3.2 Modelul obiectului. 65 4.3.3 Exemplu de implementare. 66 4.3.3.1 Suma a două funcții. 66 4.3.3.2 Produsul a două funcții. 67 4.3.4 Variații ale modelului. 69 4.3.5 Rezumat. 71 4.3.6 Exerciții. 72 II Practică. 73 5 Exemple practice: Etude individuale. 75 5.1 Divizibilitate la primul. 75 5.1.1 Cunoștințe prealabile din carte. 75 5.1.2 Sarcină. 75 5.1.3 Analiza problemei. 75 5.1.4 Descriere algoritmică. 76 5.1.5 Programare în Java. 77 5.1.6 Atenție, capcană. 78 5.1.7 Exerciții. 79 5.2 Divizibilitatea în a doua. 79 5.2.1 Cunoștințe prealabile din carte. 79 5.2.2 Sarcină. 79 5.2.3 Analiza problemei. 79 5.2.4 Descriere algoritmică. 80 5.2.5 Programare în Java. 80 5.2.6 Atenție, capcană. 81 5.2.7 Exerciții. 82 5.3 Trei lucruri. 82 5.3.1 Cunoștințe prealabile din carte. 82 5.3.2 Sarcină. 82 5.3.3 Analiza problemei. 83 5.3.4 Descriere algoritmică. 83 5.3.5 Programare în Java. 84 5.3.6 Atenție, capcană. 87 5.3.7 Exerciții. 87 5.4 Problema mindfulness. 87 5.4.1 Cunoștințe prealabile din carte. 87 5.4.2 Sarcină. 87
Cuprins 7 6.9 Iterarea 9: Când s este cel mai bun. 210 6.9.1 Unele pregătiri. 210 6.9.2 Compararea ceasului. 212 6.9.3 Dialogul Setări. 214 6.9.4 Rezumat. 217 Bibliografie. 219
Bine ați venit Bine ați venit la suplimentul la "Programarea cursurilor de bază în Java". Presupunem că ați dat peste acest document prin intermediul cărții noastre. Dacă da, vă putem felicita doar pentru setea dvs. de informații suplimentare. Sperăm că extensiile web vă vor ajuta să aprofundați și să aplicați cunoștințele pe care le-ați dobândit. Acest document este împărțit în două părți: teorie și practică. În partea teoretică ne vom ocupa de aspecte ale programării Java care, din păcate, nu își au locul în carte. Acestea includ adnotări Java, teste unitare și modele de proiectare. În partea practică, vom învăța să ne aplicăm cunoștințele de carte folosind sarcini practice de programare. Am învățat multe despre Java și acum suntem teoretic capabili să scriem primele programe mai complexe. Din păcate, nu se poate învăța o limbă pe baza teoriei decât să conducă o mașină - avem nevoie de practică. În acest scop, vom încerca să rezolvăm diverse sarcini și, mai ales, să ne ocupăm de modul de abordare sistematică a unei probleme, de a căuta o soluție și de a o programa în Java.
14 1 Corzi pentru Advanced Majer. Dacă îl priviți corect, într-adevăr știm doar prima și ultima două litere. Primul nume începe cu un H, dar nu ne putem aminti. nu știm dacă persoana în cauză mai are un prenume care apare în agenda telefonică. Din fericire, agenda noastră telefonică are un CD-ROM pe care putem căuta anumite criterii de căutare. Criteriile de căutare sunt comunicate computerului într-un anumit format - o expresie regulată. Deci totul este clar, este doar un alt limbaj de calculator (cum ar fi Java) pe care trebuie doar să-l învățăm. 1.2 Un exemplu concret Această secțiune nu este destinată să fie o introducere completă în lumea expresiilor regulate. Pentru mai multe detalii, vă recomandăm să consultați documentația pentru clasa java.util.regex.pattern. După cum vom vedea din exemplul următor, elementele de bază nu sunt deosebit de dificile. Următorul program este o versiune simplificată a agendei noastre de telefonie electronică: 1 căutare de text public < 2 3 public static void main(string[] args) < 4 String[] namensliste = < 5 "Fritz Maier", 6 "Karl Hansen", 7 "Fred Mustermann", 8 "Horst Metzger", 9 "Hermann Meyer", 10 "Fritz H. Maurer", 11 "Hoerbi Maier", 12 "Hans Maler", 13 "Harry Mooshammer", 14 "Hurgan Malinkow" 15; 16 String suchstring = ". "; 17 for(int i = 0; i javac -Xlint SmallDog.java SmallDog.java:3: warning: [deprecation] belle() in Dog has been deprecated public String belle() < ˆ 1 warning Mit dieser einfachen Änderung haben wir es den Benutzern unserer Klasse leicht gemacht, veralteten Code zu erkennen und zu vermeiden. Es sollte an dieser Stelle auch erwähnt werden, dass es guter Stil ist, in der Javadoc Dokumentation zu erklären, wie diese Vermeidung stattfinden kann. Das folgende Programm zeigt die komplette Klasse mit veraltetem Code und inklusive korrekter Dokumentation: 1 public class Dog < 2 3 /** 4 * @deprecated verwende stattdessen
24 2 Adnotări în Java 2.1.3 Adnotarea @SuppressWarnings În secțiunea anterioară a fost arătat modul în care utilizarea adnotării @Deprecated ar putea furniza compilatorului Java informații suplimentare care au dus la avertismente în timpul procesului de compilare. Avertismentele sunt utile, deoarece alertează programatorul despre lucruri care ar putea fi o problemă. Prea multe avertismente (și inutile) pun totuși o problemă, deoarece sunt ca un zgomot pe linia telefonică: deranjează și distrag atenția de la lucrurile cu adevărat importante de care trebuie să fii atent. De exemplu, să luăm următoarea metodă: hartă statică publică a (K cheie1, V valoare1, Obiect. Mai multe chei) < Map result = new HashMap (); result.put(key1, value1); for (int i = 0; i javac -Xlint SuppressWarningsExample.java SuppressWarningsExample.java:23: warning: [unchecked] unchecked cast found: java.lang.object required: K (K) morekeyvals[i], ˆ SuppressWarningsExample.java:24: warning: [unchecked] unchecked cast found: java.lang.object required: V (V) morekeyvals[i + 1]); ˆ Wo liegt das Problem, und wie lösen wir es? Wie wir in Abschnitt 11.2 des Buches gelernt haben, sind generische Methoden ein wunderbares Mittel, um
32 2 Adnotări în Java 34 Clasa [] din (); 35 boolean isnullable () implicit false; 36 37 Desigur, scrierea de adnotări noi se simte cam ciudat (autorul trebuie să caute și sintaxa exactă de fiecare dată când scrie o nouă adnotare). Vestea bună este că, în practică, petreceți mult mai puțin timp scriind și mult mai mult timp folosind adnotarea terminată și asta vrem să facem. 2.2.3 Evaluarea adnotărilor Adnotările sunt utilizate în două forme diferite: un programator va dori fie să le evalueze în timpul rulării, fie în timpul compilării unui program. Acesta din urmă este destul de complex și, prin urmare, ne referim la [17]. La sfârșitul acestui capitol dorim să scriem o clasă CodoProxy care verifică automat condițiile prealabile pentru implementarea unei interfețe. În cazul interfeței noastre de adăugare, utilizarea ar trebui să arate astfel: 1 import codo.codoproxy; 2 3 program demo de clasă publică < 4 5 public static class AddiererImpl implements Addierer < 6 @Override 7 public Integer addvalues(integer v1, Integer v2) < 8 return v1 + v2; 9 10 11 @Override 12 public Integer addtoint(integer v1, Number v2) < 13 return addvalues(v1, v2.intvalue()); 14 15 16 17 public static void main(string[] args) < 18 Addierer proxied = CodoProxy.makeProxy(Addierer.class, 19 new AddiererImpl()); 20 21 // Normalfall 22 System.out.println(proxied.addValues(1, 2)); 23 System.out.println(proxied.addToInt(1, (byte) 2)); 24 25 // Parameter ist null 26 try < 27 System.out.println(proxied.addValues(1, null)); 28 catch (NullPointerException expected) < 29 expected.printstacktrace(); 30
34 2 Adnotări în Java cu care sunt decorați parametrii metodei. Valoarea returnată este un câmp bidimensional. Prima dimensiune corespunde parametrilor 8. Să presupunem că avem o metodă m și un câmp de parametri parametri cu care ar trebui să fie apelată și dorim să verificăm adnotarea NotNull. În primul pas trebuie să ajungem la lista tuturor adnotărilor: Adnotare [] [] toate = m.getparameterannotations (); Acum iterăm prin prima dimensiune a câmpului, care corespunde parametrilor parametrilor, și aruncăm o privire la fiecare adnotare definită pentru parametrul corespunzător: pentru (int i = 0; T obiectul interior) < 54 return (T) Proxy.newProxyInstance( 55 innerobject.getclass().getclassloader(), 56 new Class[]
3.1 Afirmații pentru utilizatorii avansați 39 eliminați din program și înlocuiți cu un apel de metodă. Acest lucru are atât avantaje, cât și dezavantaje: Dezavantajul este că afirmațiile JUnit nu pot fi pur și simplu dezactivate. Afirmațiile Java pot fi pur și simplu activate sau dezactivate în mașina virtuală 2. Acest lucru poate încetini execuția, în special în codul extrem de intens din punct de vedere al calculului. Avantajul este că afirmațiile JUnit funcționează și cu versiuni mai vechi Java (adică înainte de 1.3). Chiar și în zilele noastre, acestea încă apar în proiectele 3, astfel încât să rămânem compatibili în jos. Desigur, numai aceste argumente nu justifică trecerea la clasa Assert. Principalul avantaj al acestei clase nu a fost încă menționat: oferă metode suplimentare de afirmare: 1 import junit.framework.assert; 2 3 public class AssertionTest2 < 4 5 public static void main(string[] args) < 6 Assert.assertNotNull("Parameter-Arrary ist null",args); 7 // assert args!= null: "Parameter-Array ist null" 8 for(int i = 0; i = 0; i--,j--) if (brett[i] == j) return true; 3. Befindet sich in der Diagonale, die schräg nach unten links verläuft, eine Dame? Die Überprüfung dieser Bedingung funktioniert genau wie die andere Diagonalrichtung mit dem Unterschied, dass wir die Variable j nun erhöhen statt erniedrigen müssen: for (int i = spalte-1, j = brett[spalte]+1; i >= 0; i -, j ++) if (board [i] == j) return true;
5.4 Problema celor opt femei 91 4. Dacă căutarea nu reușește acolo, reveniți la pasul 2. Dacă căutarea are succes, am terminat. Raportați succesul ca rezultat. 5. Dacă am ajuns la a opta coloană fără succes, suntem blocați într-un impas. În consecință, raportați eșecul. Nu vedem doar că căutarea doamnei potrivite este structurată în același mod pentru toate coloanele; mai degrabă, vedem, de asemenea, că comunicarea dintre căutările de coloane individuale poate fi urmărită la un adevărat simplu (= căutarea a avut succes) sau fals (= căutarea nu a avut succes). La rândul său, o singură valoare booleană poate fi returnată foarte convenabil printr-o metodă. Ne definim metoda în primul rând ca și cum am fi vrut să căutăm soluția pentru o coloană foarte specifică. Deci, ca parametri, avem nevoie de numărul coloanei în care căutăm și de câmpul în care ar trebui să plasăm. Valoarea returnată este (așa cum s-a solicitat mai sus) o valoare booleană: set static boolean public (int [] bord, coloană int) < Wir wollen nun überlegen, wie wir obige fünf Schritte am besten in ein Java- Programm kleiden. Beginne in der ersten Zeile und versuche es eine Zeile tiefer das klingt verdächtig nach einer Schleife! Wir formulieren also einefor- Schleife, die über die einzelnen Zeilennummern läuft: for (int i=0; i = 0; i--,j--) 11 if (brett[i] == j) 12 return true; 13 14 // Teste, ob in der unteren Diagonale eine Dame steht 15 for (int i = spalte-1, j = brett[spalte]+1; i >= 0; i -, j ++)
ƒ dgcmifgjgnlky ZIJJ NGM ENJKG \\ KNL DKK`M cnzl H] K edlznf m ˆr pšswyƒ agek ZGN MŒI F ZNL dcifknm ZNJ dcgnfelnkkj ŒDL H] f klmn Ž uvvv
ƒ agek ZNM I] KDNFFNM [M IFK NGMNJ ENJKG \\ KNM NFZNJ ŒDL H] fk š œ m vq uvžÿov yƒ agek ZNM NK ŒDL H] Y ZNL I] KDNFF IDO ZN \ NMDNL DKK` œ m vq ŸŠv ŸŠvyƒ agek ZNM I \ NM ZNJ dcgnfnj IFJ dklgmc ŒDL H] fk š œ m vq vwwÿ vwyƒ agek ZNM NK ŒDL H] Y ZNL GM ZNL I`] KDNFFNM DMZN ZGN MŒI F ZNL NGFNM ZNJ dcgnfelnkkj ŒDL H] f? 87g @ A ª87; «B ± ² zz< ur wyƒ agek ZGN MŒI F ZNL NGFNM ZNJ dcgnfelnkkj ŒDL H]f ³GN MŒI F ZILO JGH G\ IDON ZNJ dcgnfnj MGH K \N L _NLµMZNLMf ¹º ±² z z< ˆr pšswyƒ agek ZGN MŒI F ZNL dcifknm ZNJ dcgnfelnkkj ŒDL H]f ³GN MŒI F ZILO JGH G\ IDON ZNJ dcgnfnj MGH K \N L _NLµMZNLMf Abbildung 5.5: Dokumentation der KlasseGameModel (Seite 1)
5.7 Game of Life 119 "¼½¾ À¼ÁÂÃ¼Ä ÅÆÇÈÉÊ ËÌÍÌÎÈÌÏÐÎÑÒÓÉÏÐ ooo ØÙÕÚÛÜÕÝÞß Âëàä CAEA éêëìíîï AAAA aA ðîãêåññ Deo AAO ôåêåëõöêãã æ øãåùåæ ø NNU" ¼½û¼üüâ "¼ü ÅÆÇÈÉÊ ËÌÍÌÎÈÌÏÐÎÑÒÓÉÏÐ ÔÕÖýÕþþÛÔÕþÞß Âëàä CAEA éêëìíîï AAAA aA AAE aA ðîãêåññåæ ÿêæäå AO åñäåòåæøãåë øãåùåæ ø NNU" ¼½ ¼ ¼ ÅÆÇÈÉÊ ËÌÍÌÎÈÌÏÐÎÑÒÓÉÏÐ ooo Û Õ Û ÕÞß Âëàä ðóåæ AAO AAAA áåñåø Dno Âëàä éêëìíîú „¼½½¼½ ÅÆÇÈÉÊ EIO ÔÕÖÖÕÖÞÉÏÒ Ó EIO EESS Âëàä ðîãêåññåæ æùðñã AAAA åáæåø âåøãáóóãåæ ôåñäåø éêëìíîú õ aaA åáñåï Ó æ Dae AE Uña EE õ aaa ðñãåï æ Dae AE! una à "½½ # À¼üü¼ $ ÅÆÇÈÉÊ IE% Ü & ÖÖ'ÙÕþþÕ (Theio Ó EIO eess áæðñáøáåëãï äðøø ãAä âåøãáóóãåë öêãã æ åäëìíîã u u u ñ ñ ñ ñ ä ä ä ñ ä ä ä ñ ñ ñ ñ ÅÆÇÈÉÊ ÍÉ% + ØÙÕ'ÙÕþþÕ (Þß áæðñáøåëãï äðøø äåë ôåêåëõöêãã æ åäëìíîã) êëäåú, -. // 0122 324125.627 8972:; 2-4? @ QR GKI = TAB AV T @ WDCF = TP> FXWV V> FBSAR US> AV T @ WDCF = TP> FXWV Figura 5.6: Documentația clasei GameModel (pagina 2)
152 5 Exemple practice: Studii individuale Tragere: 3 Start: = (03) = Obiectiv: = Pol auxiliar: = (02) = (01) = Tragere: 4 Start: = Scop: = (03) = Pol auxiliar: = (02) = (01) = Tren: 5 Start: = (01) = Țintă: = (03) = Tija auxiliară: = (02) = Tren: 6 Start: = (01) = Scop: = (03) = (02) = Tija auxiliară: = Tren: 7 Start: = Destinație: = (03) = (02) = (01) = Bara auxiliară: = 5.10 Indicele masei corporale Indicele masei corporale este un parametru foarte simplu în ceea ce privește întrebarea dacă o persoană este supraponderal sau subponderal. Se calculează utilizând formula IMC = greutate în kg (înălțime în m) 2 Tabelul 5.2 arată modul în care indicele de masă corporală poate fi utilizat pentru a determina dacă o persoană este supraponderală sau subponderală. Trebuie remarcat faptul că IMC nu este în mod normal semnificativ pentru adolescenții cu vârsta sub 18 ani. În această secțiune dorim să scriem un program ușor de utilizat, care permite utilizatorului să își calculeze IMC și să afișeze un avertisment dacă valoarea este prea mare sau prea mică. 5.10.1 Cunoștințe anterioare din carte Acest exercițiu tratează un număr mare de concepte noi din programarea interfețelor grafice: