diff --git a/ws/eclipse/Sda1PreExam/Exercises/OO/ex1.xhtml b/ws/eclipse/Sda1PreExam/Exercises/OO/ex1.xhtml index 51e124316de7ab81e6ef0e70d51e2868b7ba6ef5..0e8029bb34f0f81f840dc6ab4491769d3c185ae3 100644 --- a/ws/eclipse/Sda1PreExam/Exercises/OO/ex1.xhtml +++ b/ws/eclipse/Sda1PreExam/Exercises/OO/ex1.xhtml @@ -6,88 +6,92 @@ </head> <body><h1>A party statistics application</h1><p>Implement the following - interface:</p><pre><code>package party1; + interface <b>using the eclipse IDE</b>:</p> +<pre><code>package party1;</code></pre> +<pre><code></code></pre> +<pre><code>/**</code></pre> +<pre><code> * Provide statistical information regarding a party. We distinguish</code></pre> +<pre><code> * between the numbers of guests and the number of organizers.</code></pre> +<pre><code> * The whole party will cost a certain amount of money being defined </code></pre> +<pre><code> * by calling {@link #setExpenses(float)}.</code></pre> +<pre><code> * </code></pre> +<pre><code> * These expenses will be paid by the organizers, the latter being set</code></pre> +<pre><code> * by calling {@link #setNumberOfOrganizers(int)}. Each organizer will have to</code></pre> +<pre><code> * pay his corresponding share.</code></pre> +<pre><code> *</code></pre> +<pre><code> */</code></pre> +<pre><code>public interface PartyStatistics {</code></pre> +<pre><code> </code></pre> +<pre><code> /**</code></pre> +<pre><code> * @param numGuests The number of guests attending the party,</code></pre> +<pre><code> * default value is zero.</code></pre> +<pre><code> */</code></pre> +<pre><code> public void setNumberOfGuests(int numGuests);</code></pre> +<pre><code> </code></pre> +<pre><code> /**</code></pre> +<pre><code> * @param numOrganizers The number of persons organizing the party,</code></pre> +<pre><code> * default value is zero.</code></pre> +<pre><code> */</code></pre> +<pre><code> public void setNumberOfOrganizers(int numOrganizers);</code></pre> +<pre><code> </code></pre> +<pre><code> /**</code></pre> +<pre><code> * </code></pre> +<pre><code> * @param expenses The sum of all costs the party has caused.</code></pre> +<pre><code> * Default value is zero (0f)</code></pre> +<pre><code> */</code></pre> +<pre><code> public void setExpenses(float expenses);</code></pre> +<pre><code> </code></pre> +<pre><code> /**</code></pre> +<pre><code> * We assume that all party participants shake hands with each</code></pre> +<pre><code> * other at arrival. Example: Having one organizer and three guests</code></pre> +<pre><code> * results in six handshakes.</code></pre> +<pre><code> * </code></pre> +<pre><code> * @return The total number of handshakes among all guests and organizers.</code></pre> +<pre><code> */</code></pre> +<pre><code> public int getNumberOfHandshakes();</code></pre> +<pre><code> </code></pre> +<pre><code> /**</code></pre> +<pre><code> * Expenses will be shared by all organizers.</code></pre> +<pre><code> * @return Each organizer's share according to {@link #setExpenses(float)} and </code></pre> +<pre><code> * {@link #setNumberOfOrganizers(int)}</code></pre> +<pre><code> */</code></pre> +<pre><code> public float getAverageExpenses();</code></pre> +<pre><code>}</code></pre> - -/** - * Provide statistical information regarding a party. We distinguish - * between the numbers of guests and the number of organizers. - * The whole party will cost a certain amount of money being defined - * by calling {@link #setExpenses(float)}. - * - * These expenses will be paid by the organizers, the latter being set - * by calling {@link #setNumberOfOrganizers(int)}. Each organizer will have to - * pay his corresponding share. - * - */ -public interface PartyStatistics { - - /** - * @param numGuests The number of guests attending the party, - * default value is zero. - */ - public void setNumberOfGuests(int numGuests); - - /** - * @param numOrganizers The number of persons organizing the party, - * default value is zero. - */ - public void setNumberOfOrganizers(int numOrganizers); - - /** - * - * @param expenses The sum of all costs the party has caused. - * Default value is zero (0f) - */ - public void setExpenses(float expenses); - - /** - * We assume that all party participants shake hands with each - * other at arrival. Example: Having one organizer and three guests - * results in six handshakes. - * - * @return The total number of handshakes among all guests and organizers. - */ - public int getNumberOfHandshakes(); - - /** - * Expenses will be shared by all organizers. - * @return Each organizer's share according to {@link #setExpenses(float)} and - * {@link #setNumberOfOrganizers(int)} - */ - public float getAverageExpenses(); -}</code></pre><h1>Solution</h1><p>An implementing class needs to keep track +<h1>Solution</h1><p>An implementing class needs to keep track about state being changed by invocations of <code>setExpenses(float expenses)</code>, <code>setNumberOfGuests(int numGuests)</code> and <code>setNumberOfOrganizers(int numOrganizers)</code>. Thus we need three corresponding instance variables <code>expenses</code>, - <code>numGuests</code> and <code>numOrganizers</code>:</p><pre><code>package party1; - -public class PartyStatisticsImpl implements PartyStatistics { - - @Override - public void setNumberOfGuests(int numGuests) { this.numGuests = numGuests;} - - @Override - public void setNumberOfOrganizers(int numOrganizers) { this.numOrganizers = numOrganizers;} - - @Override - public void setExpenses(float expenses) { this.expenses = expenses;} - - @Override - public float getAverageExpenses() { - return expenses / numOrganizers; - } - @Override - public int getNumberOfHandshakes() { - final int totalPersonsNum = numGuests + numOrganizers; - return totalPersonsNum * (totalPersonsNum - 1) / 2; - } - - int numGuests = 0; - int numOrganizers = 0; - float expenses = 0f; -}</code></pre><p>The three internal values must be initialized to zero in + <code>numGuests</code> and <code>numOrganizers</code>:</p> +<pre><code>package party1;</code></pre> +<pre><code></code></pre> +<pre><code>public class PartyStatisticsImpl implements PartyStatistics {</code></pre> +<pre><code> </code></pre> +<pre><code> @Override</code></pre> +<pre><code> public void setNumberOfGuests(int numGuests) { this.numGuests = numGuests;}</code></pre> +<pre><code></code></pre> +<pre><code> @Override</code></pre> +<pre><code> public void setNumberOfOrganizers(int numOrganizers) { this.numOrganizers = numOrganizers;}</code></pre> +<pre><code></code></pre> +<pre><code> @Override</code></pre> +<pre><code> public void setExpenses(float expenses) { this.expenses = expenses;}</code></pre> +<pre><code></code></pre> +<pre><code> @Override</code></pre> +<pre><code> public float getAverageExpenses() {</code></pre> +<pre><code> return expenses / numOrganizers;</code></pre> +<pre><code> }</code></pre> +<pre><code> @Override</code></pre> +<pre><code> public int getNumberOfHandshakes() {</code></pre> +<pre><code> final int totalPersonsNum = numGuests + numOrganizers;</code></pre> +<pre><code> return totalPersonsNum * (totalPersonsNum - 1) / 2;</code></pre> +<pre><code> }</code></pre> +<pre><code> </code></pre> +<pre><code> int numGuests = 0;</code></pre> +<pre><code> int numOrganizers = 0;</code></pre> +<pre><code> float expenses = 0f;</code></pre> +<pre><code>}</code></pre> +<p>The three internal values must be initialized to zero in accordance with their defaults as being described in the methods' documentation of the interface <code>PartyStatistics</code>.</p></body> </html> diff --git a/ws/eclipse/Sda1PreExam/Exercises/OO/ex2.xhtml b/ws/eclipse/Sda1PreExam/Exercises/OO/ex2.xhtml index 9420ead8680dcba7c4effa5fbcab337d2c5bea34..1a7105f27af8f449cff5d5eecf426b927088bc6e 100644 --- a/ws/eclipse/Sda1PreExam/Exercises/OO/ex2.xhtml +++ b/ws/eclipse/Sda1PreExam/Exercises/OO/ex2.xhtml @@ -5,24 +5,31 @@ <title></title> </head> - <body><h1>The <code>Override</code> annotation</h1><p>In the suggested - solution of the previous exercise you found the - <code>java.lang.Override</code> annotation:</p><pre><code>... + <body> + <!-- Exercise 1 --> -public class PartyStatisticsImpl implements PartyStatistics { - - <b>@Override</b> - public void setNumberOfGuests(int numGuests) { this.numGuests = numGuests;} + <h1>The <code>Override</code> annotation</h1> + <p>In the suggested + solution of the previous exercise you will find the + <code>java.lang.Override</code> annotation:</p> +<pre><code>...</code></pre> +<pre><code>public class PartyStatisticsImpl implements PartyStatistics { </code></pre> +<pre><code> <b>@Override</b></code></pre> +<pre><code> public void setNumberOfGuests(int numGuests) { ...}</code></pre> +<pre><code>...</code></pre> -...</code></pre><p>Answer the following three questions:</p><ol> + <p>Answer the following three questions with respect to <code>@override</code>:</p><ol> <li>Explain its precise meaning in the current context.</li> - <li>Do you know a different Java meaning of <code>Override</code> in - context of a related problem?</li> + <li>Do you know a different Java meaning of <code>@Override</code> in a + similar but yet different context?</li> <li>What happens to the way the code executes if the - <code>Override</code> annotations are being erased?</li> - </ol><h1>Solution</h1><ol> + <code>@Override</code> annotations are being omitted? Whats the catch of + using <code>@Override</code>?</li> + </ol> + +<h1>Solution</h1><ol> <li>The method <code>void setNumberOfGuests(int numGuests)</code> in class <code>PartyStatisticsImpl</code> implements a method <code>void setNumberOfGuests(int numGuests)</code> from the interface @@ -31,80 +38,111 @@ public class PartyStatisticsImpl implements PartyStatistics { <li><p>The <code>Override</code> annotation may indicate that a method in a derived class overrides a corresponding method in one of its parent classes (in a given inheritance hierarchy). Consider the following - example:</p><pre><code><b>File A.java:</b> - -public class A { - void myDoNothingMethod(){} -} ----------------------------------- -<b>File B.java</b>: - -public class B extends A { - // More code to be added later -} ------------------------------------ -<b>File C.java</b>; + example:</p> +<pre><code><b>File A.java:</b></code></pre> +<pre><code></code></pre> +<pre><code>public class A {</code></pre> +<pre><code> void myDoNothingMethod(){}</code></pre> +<pre><code>}</code></pre> +<pre><code>----------------------------------</code></pre> +<pre><code><b>File B.java:</b></code></pre> +<pre><code></code></pre> +<pre><code>public class B extends A {</code></pre> +<pre><code> // More code to be added later</code></pre> +<pre><code>}</code></pre> +<pre><code>-----------------------------------</code></pre> +<pre><code><b>File C.java</b>;</code></pre> +<pre><code></code></pre> +<pre><code>public class C extends B {</code></pre> +<pre><code></code></pre> +<pre><code> @Override</code></pre> +<pre><code> void myDoNothingMethod() {}</code></pre> +<pre><code>}</code></pre> +</li> -public class C extends B { + <li><p>Nothing. But accidentally changing the method's name or signature + yields a compiler error. Consider the following example:</p> - @Override - void myDoNothingMethod() {} -}</code></pre></li> +<pre><code>...</code></pre> +<pre><code></code></pre> +<pre><code>public class PartyStatisticsImpl implements PartyStatistics {</code></pre> +<pre><code> </code></pre> +<pre><code> <b>@Override</b></code></pre> +<pre><code> public void setNumberOfGuest(int numGuests) { this.numGuests = numGuests;}</code></pre> +<pre><code></code></pre> +<pre><code>...</code></pre> - <li><p>Nothing. But accidentally changing the method's signature yields - a compiler error. Consider the following example:</p><pre><code>... - -public class PartyStatisticsImpl implements PartyStatistics { - - <b>@Override</b> - public void setNumberOfGuest(int numGuests) { this.numGuests = numGuests;} - -...</code></pre><p>Do you see the typo? The <q>s</q> is missing at the end of +<p>Do you see the typo? The "s" is missing at the end of <code>setNumberOfGuest</code>. Thanks to the <code>Override</code> annotation this mistake gets flagged by a compile time error <q>The method setNumberOfGuest(int) of type PartyStatisticsImpl must override - or implement a supertype method</q>.</p></li> - </ol><h1>Handling missing organizers</h1><p>Our (Your??) current - implementation contains a problem. The method float getAverageExpenses() - assumes a non-zero number as being stated in its documentation. Violating + or implement a supertype method</q>. Similar using a different parameter + type e.g. <code>String</code> in favour of <code>int</code> will be + flagged as an error, too.</p></li> + </ol> + +<h1>Handling missing organizers</h1> +<p>Our (Your??) current + implementation contains a problem. The method <code>float getAverageExpenses()</code> + assumes a non-zero number of organizers to share expenses as being stated in its documentation. Violating this precondition yields a division by zero and thus an unchecked runtime - exception due to:</p><pre><code>@Override -public float getAverageExpenses() { - return expenses / <b>numOrganizers</b>; -}</code></pre><p>We want to have a checked exception instead. Modify both the + exception due to:</p> +<pre><code></code></pre> +<pre><code>@Override</code></pre> +<pre><code>public float getAverageExpenses() {</code></pre> +<pre><code> return expenses / <b>numOrganizers</b>;</code></pre> +<pre><code>}</code></pre> +<p>We want to have a checked exception instead. Modify both the interface and your implementation accordingly by introducing a - <b>suitable</b> exception class.</p><h1>Solution</h1><p>We add an exception - class related to arithmetic errors:</p><pre><code>/** - * According to {@link PartyStatistics#getAverageExpenses()} a party's - * costs will be shared by the organizers and thus divided by their respective - * number. If the number of organizers is zero this exception - * will be thrown on invocation of {@link PartyStatistics#getAverageExpenses()}. - * - */ -public class <b>NoOrganizerException extends ArithmeticException</b> { - @Override - public String getMessage() { - return "No organizer has been defined. How shall I share costs?"; - } -}</code></pre><p>We have to modify our interface:</p><pre><code>public interface PartyStatistics { - - ... - /** - * Expenses will be shared by all organizers. - * @return Each organizer's share according to {@link #setExpenses(float)} and - * {@link #setNumberOfOrganizers(int)} - * @throws NoOrganizerException in case the number of organizers is zero - */ - public float getAverageExpenses() <b>throws NoOrganizerException</b>; - -}</code></pre><p>Our implementation now reads:</p><pre><code>... -@Override -public float getAverageExpenses() throws NoOrganizerException { - if (0 < numOrganizers) { - return expenses / numOrganizers; - } else { - throw new NoOrganizerException(); - } -} -...</code></pre></body> + <b>suitable</b> exception class.</p> + +<!-- Exercise 2 --> + +<h1>Solution</h1> + +<p>We add an exception + class related to arithmetic errors:</p> +<pre><code></code></pre> +<pre><code>/**</code></pre> +<pre><code> * According to {@link PartyStatistics#getAverageExpenses()} a party's</code></pre> +<pre><code> * costs will be shared by the organizers and thus divided by their respective</code></pre> +<pre><code> * number. If the number of organizers is zero this exception</code></pre> +<pre><code> * will be thrown on invocation of {@link PartyStatistics#getAverageExpenses()}.</code></pre> +<pre><code> *</code></pre> +<pre><code> */</code></pre> +<pre><code>public class <b>NoOrganizerException extends ArithmeticException</b> {</code></pre> +<pre><code> @Override</code></pre> +<pre><code> public String getMessage() {</code></pre> +<pre><code> return "No organizer has been defined. How shall I share costs?";</code></pre> +<pre><code> }</code></pre> +<pre><code>}</code></pre> + +<p>We have to modify our interface accordingly:</p> + +<pre><code></code></pre> +<pre><code>public interface PartyStatistics {</code></pre> +<pre><code> </code></pre> +<pre><code> ... </code></pre> +<pre><code> /**</code></pre> +<pre><code> * Expenses will be shared by all organizers.</code></pre> +<pre><code> * @return Each organizer's share according to {@link #setExpenses(float)} and </code></pre> +<pre><code> * {@link #setNumberOfOrganizers(int)}</code></pre> +<pre><code> * <b>@throws NoOrganizerException in case the number of organizers is zero</b></code></pre> +<pre><code> */</code></pre> +<pre><code> public float getAverageExpenses() <b>throws NoOrganizerException</b>;</code></pre> +<pre><code> </code></pre> +<pre><code>}</code></pre> + +<p>Our implementation now reads:</p> +<pre><code>...</code></pre> +<pre><code>@Override</code></pre> +<pre><code>public float getAverageExpenses() <b>throws NoOrganizerException</b> {</code></pre> +<pre><code> if (0 < numOrganizers) {</code></pre> +<pre><code> return expenses / numOrganizers;</code></pre> +<pre><code> } else {</code></pre> +<pre><code> <b>throw new NoOrganizerException();</b></code></pre> +<pre><code> }</code></pre> +<pre><code>}</code></pre> +<pre><code>...</code></pre> +</body> </html>