Suunnittelumallit Androidissa – Builder
Builder
Builder-malli yksinkertaistaa objektien luomista erittäin siistillä ja luettavalla tavalla. Se on erittäin hyödyllinen, kun meillä on joitakin malliluokkia, joilla on monia parametreja. Voimme tehdä joistakin niistä valinnaisia tai pakollisia, emmekä pakota käyttäjää käyttämään tiettyä järjestystä (kuten konstruktorissa). Käyttämällä Builder-mallia saamme aikaan tyylikkään metodiketjun. Yleisin käyttö on AlertDialog.Builder()
-luokassa:
new AlertDialog.Builder(this)
.setTitle("Design Patterns")
.setMessage("Builder is awesome")
.create();
Miten voimme luoda Builder-luokan omaan käyttöömme?
Builder käytännössä
Asettakaamme, että meillä on jokin malliluokka käyttäjälle:
public class User {
private String firstName;
private String lastName;
private int age;
}
Ja sen sijaan, että luomme tämän luokan objekteja konstruktoreiden avulla, haluaisimme luoda ne Builder-kuvion avulla seuraavalla tavalla:
new User.Builder()
.setFirstName("Leonardo")
.setLastName("da Vinci")
.setAge(67)
.create();
Miten voimme tehdä sen? Ensinnäkin meidän on luotava Builder
-luokka User
-luokan sisälle, jossa on metodit objektimme rakentamiseen. Avain ketjutusmetodien olemassaoloon on se, että rakentajametodit palauttavat Builder
-luokan. Katso esimerkkiä:
static class Builder {
private String firstName;
private String lastName;
private int age;
public Builder setFirstName(final String firstName) {
this.firstName = firstName;
return this;
}
public Builder setLastName(final String lastName) {
this.lastName = lastName;
return this;
}
public Builder setAge(final int age) {
this.age = age;
return this;
}
public User create() {
return new User(this);
}
}
Jokaista parametria varten meillä on setter – erona on, että nämä metodit palauttavat Builder
-tyypin. Lopussa meillä on metodi, joka käyttää User
-luokan konstruktoria ja palauttaa User
-olion – tässä on paikka, jossa sotkumme pysyy piilossa.
Sitten meidän on luotava konstruktori, jossa on kaikki parametrit malliluokassa User
:
public class User {
private String firstName;
private String lastName;
private int age;
private User(final Builder builder) {
firstName = builder.firstName;
lastName = builder.lastName;
age = builder.age;
}
}
Tärkeää tässä on se, että User
-luokan konstruktori on yksityinen (private), joten siihen ei pääse käsiksi toisesta luokasta, ja meidän on käytettävä Builder
:tä luodaksemme uuden olion.
Voidaan tietysti tehdä joistakin parametreista pakollisia (sillä toistaiseksi kaikki ovat valinnaisia) muokkaamalla create()
-metodia ja heittämällä joitain poikkeuksia, esimerkiksi:
public User create() {
User user = new User(firstName, lastName, age);
if (user.firstName.isEmpty()) {
throw new IllegalStateException(
"First name can not be empty!");
}
return user;
}
Se on siinä. Näin loimme User.Builder()
-luokkamme!
Builder – protip
Jos olit tarpeeksi kärsivällinen lukeaksesi koko blogikirjoituksen läpi, minulla on sinulle yksi vinkki Builder-kuvioon liittyen: voit luoda koko Builder-luokan IntelliJ:n avulla!
Asia mitä sinun tarvitsee tehdä, on vain sijoittaa caret luokkasi konstruktorin kohdalle ja valita kontekstivalikosta Refactor -> Korvaa konstruktori Builderilla. Builder-luokka kaikkine metodeineen luodaan automaattisesti, valmiina käytettäväksi.
Voit lukea lisää täältä: IntelliJ: Replace Constructor with Builder
Conclusion
Builder-kuvio on loistava lähestymistapa, ei vain malliluokkiin vaan kaikkiin objekteihin, joilla on enemmän kuin kolme tai neljä parametria. Pienellä lisätyöllä voimme lisätä koodimme luettavuutta. Suunnittelukuviot on tunnustettu parhaaksi käytännöksi, joten on suuri etu, jos tunnet joitakin niistä, ja Builder on hyvä malli aloittaa
.