Programutvecklingsteknik
Extrauppgifter
- Ett vanligt fel: I följande applet ska bakgrunden bli gul
när man trycker på knappen men inget händer. Programmet går bra att
kompilera samt exekveras utan felmeddelanden. Vad är det som är fel ?
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class FelApplet extends Applet implements ActionListener {
Button knapp;
public void init () {
Button knapp = new Button("Gulknapp");
add(knapp);
knapp.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == knapp)
setBackground(Color.yellow);
}
}
- Onödigt skapande av objekt: Genom att ändra ett enda tecken i
följande program får man programmet att gå mycket fortare. Vilket tecken är
det och varför går det fortare? Det är inte att betrakta som optimering
av programmet att undvika den här typen av misstag! Uppgiften är hämtad
ur Joshua Bloch: Effective Java
class Test {
public static void main(String[] u) {
Long sum = 0L;
for (long i = 0; i< Integer.MAX_VALUE; i++)
sum += i;
System.out.println(sum);
}
}
- Små knepigheter ur Java Puzzlers av Joshua Bloch
och Neal Gafter:
Hur ska variabeln
x deklareras (och initieras) för att
följande ska bli oändliga loopar? Det är olika svar för de olika fallen.
-
while (x != x + 0){}
-
while (x != x){}
-
while (x == x + 1){}
- Deklarera hjälpvariabler så sent som möjligt: Här är iterationer
över två Collections, c och c2, båda med element av typ
El .
Koden går bra att kompilera men
iteration nummer två slutar innan den har börjat. Vad är fel,
vad är trolig orsak till felet och hur skriver man det bättre?
Även denna uppgift är inspirerad av Effective Java.
Iterator<El> i = c.iterator();
while (i.hasNext()) {
doSomething(i.next());
...
Iterator<El> i2 = c2.iterator();
while (i.hasNext()) {
doSomething(i2.next());
- Mera iteratorer: Om man vill generera
alla kombinatoner av element från en (eller två) Collections kan man
använda två iteratorer:
for (Iterator i = f.iterator(); i.hasNext();)
for (Iterator j = f.iterator(); j.hasNext();)
System.out.print(i.next() + "-" + j.next() + " ");
Om samlingen f innehåller talen 1,2,3,4,5,6 kommer utskriften att bli
1-1 2-2 3-3 4-4 5-5 6-6
Det blir alltså 6 kombinationer istället för 36 som man ville ha.
Vad är fel och hur borde man gjort?
|
|