bild
Skolan för
elektroteknik
och datavetenskap

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.
    1.  while (x != x + 0){}
    2.  while (x != x){}
    3.  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?
Copyright © Sidansvarig: Ann Bengtsson <ann@nada.kth.se>
Uppdaterad 2014-03-22