Flexibel programmieren mit dem Fluent Interface

Seite 7: Listings

Inhaltsverzeichnis
 @Test
public void nimmtWerteFuerStellenAuf() throws Exception {
Abschnitt abschnitt = new Abschnitt();
abschnitt.setName("abschnittsname");
final String ersterWert = "a";
final int ersteStelle = 1;
final String zweiterWert = "b";
final int zweiteStelle = 2;
abschnitt.add(ersteStelle, ersterWert);
abschnitt.add(zweiteStelle, zweiterWert);
assertThat(ersterWert, is(abschnitt.findeWertAnStelle(ersteStelle)));
assertThat(zweiterWert, is(abschnitt.findeWertAnStelle(zweiteStelle)));
}

Ausschnitt aus AbschnittTest

 
public class Abschnitt {
Map werteZuStellen = new HashMap();
private String letzterWert;
private String name;
public Abschnitt mitWert(String wert) {
return setLetzterWert(wert);
}
private Abschnitt setLetzterWert(String wert) {
letzterWert = wert;
return this;
}
public Abschnitt undMitWert(String wert) {
return setLetzterWert(wert);
}
public Abschnitt anStelle(int stelle) {
werteZuStellen.put(stelle, letzterWert);
return this;
}
public String getName() {
return name;
}
public static Abschnitt mitNamen(String name) {
final Abschnitt abschnitt = new Abschnitt();
abschnitt.name = name;
return abschnitt;
}
/* weitere Methoden */
}

Erster Schritt zum Fluent Interface

public class Abschnitt {
private final Map werteZuStellen = new HashMap();
private String name;
public static Abschnitt mitNamen(String name) {
Abschnitt abschnitt = new Abschnitt();
abschnitt.name = name;
return abschnitt;
}
public AbschnittWertZuStelleDescriptor mitWert(String wert) {
final Abschnitt abschnitt = this;
final WertZuStelleAddierer addierer = new WertZuStelleAddierer() {
public Abschnitt addWertZuStelle(String wert, int stelle) {
werteZuStellen.put(stelle, wert);
return abschnitt;
}
};
return new AbschnittWertZuStelleDescriptor(addierer, wert);
}
public AbschnittWertZuStelleDescriptor undMitWert(String wert) {
return mitWert(wert);
}
public String getName() {
return name;
}
/* weitere Methoden */
}

Erweiterung um einen Deskriptor

public class AbschnittWertZuStelleDescriptor {
private WertZuStelleAddierer addierer;
private String letzterWert;
public AbschnittWertZuStelleDescriptor(WertZuStelleAddierer addierer, String
letzterWert) {
this.addierer = addierer;
this.letzterWert = letzterWert;
}
public Rueckgabe anStelle(int stelle) {
return addierer.addWertZuStelle(letzterWert, stelle);
}
}
public interface WertZuStelleAddierer {
Rueckgabewert addWertZuStelle(String wert, int stelle);
}

Addierer und Deskriptor