Програмиране на основен курс в Java - PDF безплатно изтегляне
Допълнения към книгата Dietmar Ratz, Jens Scheffler, Detlef Seese, Jan Wiesenberger Basic Course Programming in Java

Съдържание I Теория. 11 1 Струни за напреднали потребители. 13 1.1 Регулярни изрази. 13 1.2 Конкретен пример. 14 1.3 Замяна на текст. 16 1.4 Резюме. 17 2 Анотации в Java. 19 2.1 Стандартни пояснения в Java SDK. 19 2.1.1 DieS @ Override Annotation. 21 2.1.2 DieS @ Оттеглена анотация. 22 2.1.3 Анотация на DieS @ SuppressWarnings. 24 2.2 Направи си сам анотации. 28 2.2.1 CoDo: Документация на кода с помощта на анотации. 28 2.2.2 Пишем нови пояснения. 29 2.2.3 Оценка на анотациите. 32 2.3 Резюме. 36 3 JUnit или изкуството да пишете код без грешки. 37 3.1 Твърдения за напреднали потребители. 38 3.2 Единични тестове. 40 3.3 Анотации и JUnit. 45 3.4 Най-добри практики. 46 3.5 Резюме. 48 4 дизайнерски мостри. 49 4.1 Какво представляват дизайнерските модели. 49 4.2 Моделът на наблюдателя. 51 4.2.1 Основна идея. 51 4.2.2 Обектният модел. 51 4.2.3 Примерно изпълнение. 52 4.2.3.1 Работа само с един наблюдател. 52 4.2.3.2 Работа с няколко наблюдатели. 55
4 Съдържание 4.2.4 Вариации на модела. 60 4.2.5 Обобщение. 61 4.2.6 Упражнения. 61 4.3 Съставният модел. 62 4.3.1 Основна идея. 62 4.3.2 Обектният модел. 65 4.3.3 Примерно изпълнение. 66 4.3.3.1 Сума от две функции. 66 4.3.3.2 Продукт на две функции. 67 4.3.4 Вариации на модела. 69 4.3.5 Обобщение. 71 4.3.6 Упражнения. 72 II Практика. 73 5 Практически примери: Индивидуални етюди. 75 5.1 Делимост към първата. 75 5.1.1 Предварителни познания от книгата. 75 5.1.2 Задача. 75 5.1.3 Анализ на проблема. 75 5.1.4 Алгоритмично описание. 76 5.1.5 Програмиране в Java. 77 5.1.6 Внимание, капан. 78 5.1.7 Упражнения. 79 5.2 Делимост към секундата. 79 5.2.1 Предварителни познания от книгата. 79 5.2.2 Задача. 79 5.2.3 Анализ на проблема. 79 5.2.4 Алгоритмично описание. 80 5.2.5 Програмиране в Java. 80 5.2.6 Внимание, капан. 81 5.2.7 Упражнения. 82 5.3 Три неща. 82 5.3.1 Предварителни познания от книгата. 82 5.3.2 Задача. 82 5.3.3 Анализ на проблема. 83 5.3.4 Алгоритмично описание. 83 5.3.5 Програмиране в Java. 84 5.3.6 Внимание, капан. 87 5.3.7 Упражнения. 87 5.4 Проблемът с вниманието. 87 5.4.1 Предварителни познания от книгата. 87 5.4.2 Задача. 87
Съдържание 7 6.9 Повторение 9: Кога s е най-доброто. 210 6.9.1 Някои препарати. 210 6.9.2 Сравнение на часовника. 212 6.9.3 Диалог за настройки. 214 6.9.4 Резюме. 217 Библиография. 219
Добре дошли Добре дошли в допълнението към "Програмиране на основен курс в Java". Предполагаме, че сте попаднали на този документ чрез нашата книга. Ако е така, можем само да ви поздравим за жаждата ви за допълнителна информация. Надяваме се, че уеб разширенията ще ви помогнат да задълбочите и приложите придобитите знания. Този документ е разделен на две части: теория и практика. В теоретичната част ще се занимаем с аспекти на програмирането на Java, които за съжаление нямат място в книгата. Те включват анотации на Java, модулни тестове и модели на проектиране. В практическата част ще се научим да прилагаме знанията си от книги, използвайки практически задачи по програмиране. Научихме много за Java и вече теоретично можем да напишем първите по-сложни програми. За съжаление, човек не може да научи език на основата на теория не повече от шофиране на кола - имаме нужда от практика. За тази цел ще се опитаме да решим различни задачи и най-вече да се справим с това как системно да подходим към даден проблем, да потърсим решение и да го програмираме в Java.
14 1 струни за Advanced Majer. Ако го погледнете правилно, ние наистина знаем само първата и последната две букви. Първото име започва с H, но не можем да си спомним. не знаем дали въпросният човек все още има бащино име, което е в телефонния указател. За щастие телефонният ни указател има CD-ROM, на който можем да търсим определени критерии за търсене. Критериите за търсене се предават на компютъра в определен формат - регулярен израз. Така че всичко е ясно, това е просто друг компютърен език (като Java), който просто трябва да научим. 1.2 Конкретен пример Този раздел не е предназначен да бъде пълно въведение в света на регулярните изрази.За повече подробности препоръчваме да разгледате документацията за класа java.util.regex.pattern. Както ще видим обаче от следващия пример, основите не са особено трудни. Следната програма е опростена версия на нашия електронен телефонен указател: 1 търсене на текст в публичен клас < 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 Анотации в Java 2.1.3 Анотация @ SuppressWarnings В предишния раздел беше показано как използването на @Deprecated Annotation може да предостави на Java компилатора допълнителна информация, която доведе до предупреждения по време на процеса на компилация. Предупрежденията са полезни, защото предупреждават програмиста за неща, които могат да създадат проблем. Твърде много (и безполезни) предупреждения обаче създават проблем, защото те са като шум по телефонната линия: те смущават и отвличат вниманието от наистина важните неща, за които трябва да внимавате. Например, нека вземем следния метод: публична статична карта на (K key1, V value1, Object. Morekeyvals) < 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 Анотации в Java 34 Class [] of (); 35 boolean isnullable () по подразбиране false; 36 37 Разбира се, писането на нови анотации се чувства малко странно (авторът също трябва да търси точния синтаксис всеки път, когато пише нова анотация). Добрата новина е, че на практика отделяте много по-малко време за писане и много повече време, използвайки готовата анотация и това искаме да направим. 2.2.3 Оценка на анотации Анотациите се използват в две различни форми: програмист ще иска да ги оцени по време на изпълнение или по време на компилирането на програма. Последното е доста сложно и поради това се позоваваме на [17]. В края на тази глава искаме да напишем клас CodoProxy, който автоматично проверява предпоставките за внедряване на интерфейс. В случая с нашия интерфейс за добавяне, използването трябва да изглежда така: 1 импортиране codo.codoproxy; 2 3 демо програма на публичен клас < 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 Анотации в Java, с които са декорирани параметрите на метода. Връщаната стойност е двумерно поле. Първото измерение съответства на параметрите 8. И така, нека приемем, че имаме метод m и поле от параметри на параметрите, с което трябва да се извика, и искаме да проверим NotNull анотацията. В първата стъпка трябва да стигнем до списъка с всички анотации: Анотация [] [] all = m.getparameterannotations (); Сега итерираме през първото измерение на полето, което съответства на параметрите на параметрите, и разглеждаме всяка анотация, която е дефинирана за съответния параметър: for (int i = 0; i S makeproxy (53 final Class class interface, final T innerobject) < 54 return (T) Proxy.newProxyInstance( 55 innerobject.getclass().getclassloader(), 56 new Class[]
3.1 Твърдения за напреднали потребители 39 премахнати от програмата и заменени с извикване на метод. Това има както предимства, така и недостатъци: Недостатъкът е, че твърденията на JUnit не могат просто да бъдат изключени. Утвържденията на Java могат просто да бъдат активирани или деактивирани във виртуалната машина 2. Това може да забави изпълнението, особено при изключително изчислително интензивен код. Предимството е, че твърденията на JUnit работят и с по-стари версии на Java (т.е. преди 1.3). Те все още се използват в проекти дори днес 3, така че оставаме съвместими надолу. Разбира се, само тези аргументи не оправдават преминаването към клас Assert. Основното предимство на този клас все още не е споменато: той предоставя допълнителни методи за твърдение: 1 import junit.framework.assert; 2 3 публичен клас 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 Проблемът на осемте жени 91 4. Ако търсенето е неуспешно там, върнете се към стъпка 2. Ако търсенето е успешно, ние сме готови. Отчетете успеха като резултат. 5. Ако сме стигнали до осмата колона без успех, сме заседнали в задънена улица. Съобщете за неуспеха като резултат. Не само виждаме, че търсенето на правилната дама е структурирано по един и същ начин за всички колони; по-скоро виждаме също така, че комуникацията между отделните търсения в колони може да бъде проследена до обикновен true (= търсенето е било успешно) или false (= търсенето не е било успешно). Една логическа стойност от своя страна може да бъде върната много удобно от метод. Ние дефинираме нашия метод на първо място, сякаш искаме да търсим решението за много конкретна колона. Така че като параметри се нуждаем от номера на колоната, в която търсим, и полето, в което трябва да поставим. Връщаната стойност е (както е поискано по-горе) булева стойност: публичен статичен булев набор (int [] борда, 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 Ž uvtuvlv
ƒ 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 \ NDNL DKK`M JKN NK JM œ 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 Игра на живот 119 "¼½¾ À¼ÁÂÃ¼Ä ÅÆÇÈÉÊ ËÌÍÌÎÈÌÏÐÎÑÒÓÉÏÐ OOO ØÙÕÚÛÜÕÝÞß AAAA Âëàä CAEA éêëìíîï АА ðîãêåññ Део äåó ôåêåëõöêãã æ øãåùåæ ø NNU" ¼½û¼üüâ "¼ü ÅÆÇÈÉÊ ËÌÍÌÎÈÌÏÐÎÑÒÓÉÏÐ ÔÕÖýÕþþÛÔÕþÞß AAAA Âëàä CAEA éêëìíîï АА AAE АА ðîãêåññåæ ÿêæäå AO åñäåòåæøãåë øãåùåæ ø NNU" ¼½ ¼ ¼ ÅÆÇÈÉÊ ËÌÍÌÎÈÌÏÐÎÑÒÓÉÏÐ OOO Û З У ÕÞß AAAA Âëàä ðóåæ äåø áåñåø DNO Âëàä éêëìíîú "¼½½¼½ ÅÆÇÈÉÊ EIO ÔÕÖÖÕÖÞÉÏÒ Ó EIO EESS AAAA Âëàä ðîãêåññåæ æùðñã åáæåø âåøãáóóãåæ ôåñäåø éêëìíîú о о ААА åáñåï æ Dae AE Уна EE х ААА ðñãåï æ Dae AE! una à "½½ # À¼üü¼ $ ÅÆÇÈÉÊ IE% Ü & ÖÖ'ÙÕþþÕ (Theio Ó EIO eess áæðñáøáåëãï äðøø ãAä âåøãáóóãåë öêãã æ åäëìíîã ëë õëë æë ñ õ á õ õ õ õ ÅÆÇÈÉÊ ÍÉ% + ØÙÕ'ÙÕþþÕ (Þß áæðñáøåëãï äðøø äå fôêåëõöêãã æ ääììîã) êëäå, -. // 0122 324125.627 8972:; 2-4? @ QR GKI = TABLCABC GN = TABLCABCC GN = TABLCABCC GN = TABLCABCC GN = TABLCABC GN = TABLCABC GN = TABLCABCC GNK = DABLCCCC AV T @ WDCF = TP> FXWV V> FBSAR US> AV T @ WDCF = TP> FXWV Фигура 5.6: Документация за класа GameModel (страница 2)
152 5 Практически примери: Индивидуални изследвания Издърпване: 3 Старт: = (03) = Цел: = Спомагателен полюс: = (02) = (01) = Издърпване: 4 Старт: = Цел: = (03) = Спомагателен полюс: = (02) = (01) = Влак: 5 Старт: = (01) = Цел: = (03) = Спомагателен прът: = (02) = Влак: 6 Старт: = (01) = Цел: = (03) = (02) = Спомагателен прът: = Влак: 7 Начало: = Дестинация: = (03) = (02) = (01) = Спомагателна лента: = 5.10 Индекс на телесна маса Индексът на телесна маса е много прост параметър по отношение на въпроса дали човек е с наднормено или поднормено тегло. Изчислява се по формулата BMI = тегло в kg (височина в m). 2 Таблица 5.2 показва как индексът на телесна маса може да се използва, за да се определи дали човек има наднормено или поднормено тегло. Трябва да се отбележи, че ИТМ обикновено няма значение за юноши на възраст под 18 години. В този раздел искаме да напишем лесна за използване програма, която позволява на потребителя да изчисли своя BMI и показва предупреждение, ако стойността е твърде висока или твърде ниска. 5.10.1 Предварителни познания от книгата Това упражнение се занимава с голям брой нови концепции от програмирането на графични интерфейси: