Korrekturen zum Buch

Korrekturen zum Buch

Einen Fehler im Buch gefunden? Dann schauen Sie erst mal hier nach, ob er vielleicht schon berichtet und berichtigt wurde.

Teil I: Einleitung

1 Einführung in Aspektorientierung

1.2 Klasse Konto - ein Fallbeispiel

1.2.1 Erweiterte Konto-Klasse

In dem Code-Beispiel auf Seite 9 oben ist ein Überbleibsel aus früheren Refactoring-Maßnahmen hängengeblieben. Die Methode kontoUeberzogen() wurde durch die Abfrage davor ersetzt (Dank an Oliver Becker für diesen Hinweis).

Hier das korrigierte Listung von Seite 8/9:

public class Konto {

    private double kontostand = 0.0;

    public void einzahlen(double betrag) {
        if (betrag < 0) {
            throw new IllegalArgumentException("Betrag negativ");
        }
        kontostand = kontostand + betrag;
    }

    public void abheben(double betrag) {
        if (betrag < 0) {
            throw new IllegalArgumentException("Betrag negativ");
        }
        if (kontostand < betrag) {
            throw new RuntimeException("keine Deckung");
        }
        kontostand = kontostand - betrag;
        if (kontoUeberzogen() {
            kontostand = kontostand + betrag;
            throw new RuntimeException("Konto berzogen");
        }
    }

    public void ueberweisen(double betrag, Konto anderesKonto) {
        abheben(betrag);
        anderesKonto.einzahlen(betrag);
    }

}

Teil II: Einführung in AspectJ

3 Joinpoints und Pointcuts

3.3 Wildcards

Eine kleiner Klarstellung/Ergänzng zu den Wildcards: ein "*" innerhalb eines Namens steht für beliebige Zeichen (Beispiel: "*Exception" steht für "RuntimeException", aber auch nur für "Exception"). Steht der "*" alleine, steht er genau für eine Klasse, Methode oder Parameter, je nachdem, wo er auftritt (Beispiel: "Date.new(*)" - hier steht der "*" für genau einen beliebigen Parameter.

Das Wildcard ".." wird für eine beliebige Package-Hierarchie oder für eine beliebige Anzahl von Parametern werden. Das Wildcard ".." kann nicht innerhalb von Namen verwendet werden, also "Ex..tion" ist nicht erlaubt (bzw. da werden die Punkte als Package-Hierarchie interpretiert), "Ex*tion" dagegen ist ein zulässiges Muster.

4 Pointcuts definieren

4.1 Anatomie eines Pointcuts

Bei der Angabe der möglichen Bezeichner (Designator) fehlt noch this, set und get, s.a. AspectJ Quick Referenz (Dank an Tobias Demuth für diese Info).

5 Advice

5.4 Die verschiedenen Advice-Typen

5.4.3 Around-Advice

Vor dem "around" muss immer noch der Typ des Rückgabewerts angegeben werden, auch wenn der Advice nichts zurückliefert (in diesem Fall ist der Rückgabewert vom Typ "void"). Diese Angabe fehlt in der Syntax-Übersicht auf Seite 140.

Syntax
Typ around( formale Parameter ) [ throws Exception-Liste ] : Pointcut {
    Body
}

8 Annotations

8.2 AspectJ-Annotations

In "Signatur-Muster" wurde in dem Taxi-Ausschnitt auf Seite 233 die @Tariff-Annotation vergessen (vgl. Taxi-Klasse im 2SpaceTaxi-Beispiel zu Kap08 Annotation). Hier das abgedruckte Beispiel, dieses Mal mit der fehlenden @Tariff-Annotation:

public class Taxi {
    
    /** Preis pro Meile */
    @Constant
    @Tariff
    private double mileageFare = 0.2;
    
    /** Preis pro Minute */
    @Constant
    private double minuteFare = 0.5;
    
    /** Grundgebuehr */
    @Constant
    private Integer basicFee = 2;
        
    /** Taxifahrer */
    @Human
    private TaxiDriver driver = new TaxiDriver("Theo");

    ...
}

8.8 @AspectJ-Annotations

Wider Erwarten hat sich seit dem M4-Milestone-Build von AspectJ 1.5.0 die @DeclareParents-Anweisung doch noch mal geändert (s.a. Developer Notebook). Damit ändert sich das Beispiel im Buch auf Seite 254/255 zu:

@Aspect
public class GefuehlsAspekt {
    
    public interface Feeling {
        String getSense();
    }
    
    public static class FeelingImpl implements Feeling {
        private String sense = "I feel good";

        public String getSense() {
            return sense;
        }
    }
    @DeclareParents(value="verwaltung.Person", defaultImpl=FeelingImpl.class)
    private Feeling introduced;
    @After("execution(* *.*(..)) && this(f) && !within(GefuehlsAspekt)")
    public void howdoyoufeeltoday(Feeling f) {
        System.out.println(f.getSense());
    }

}
Achtung:
Entgegen der Beschreibung im Developer's Notebook muss es FeelingImpl.class und nicht "FeelingImpl" heißen.

Das komplette (und korrigierte) Beispiel finden Sie unter Beispiele zu Kapitel 8 im Ordner 6PersonAnnoStyle in der Datei GefuehlsAspekt.aj.

9 Der AspectJ-Werkzeugkasten

9.1 Ausgelieferte Dokumentation

9.1.1 AspectJ-Guide

Eigentlich ist es keine Korrektur, sondern nur eine Ergänzung zur "Quick-Reference" (S. 262 unten). In der endgültigen Version gibt es neben der erwähnten "quickA4.pdf" noch den "quick5A4.pdf", der zusätzlich die AspectJ5-Features behandelt. Diese erweiterte Quick-Referenz erstreckt sich damit über 4 Seiten.


letzte Änderung: 30. September 2008