Design Patterns in Android – Builder

Builder

Az építőminta nagyon tiszta és olvasható módon egyszerűsíti az objektumok létrehozását. Nagyon hasznos, ha van néhány modell osztályunk sok paraméterrel. Néhányat közülük opcionálissá vagy kötelezővé tehetünk, és nem kényszerítjük a felhasználót meghatározott sorrend használatára (mint a konstruktorban). A Builder minta használatával a metódusok elegáns láncolatát kapjuk. A leggyakoribb felhasználás a AlertDialog.Builder() osztályban:

new AlertDialog.Builder(this)
.setTitle("Design Patterns")
.setMessage("Builder is awesome")
.create();

Hogyan tudunk Builder osztályt létrehozni saját felhasználásra?

Builder a gyakorlatban

Tegyük fel, hogy van valamilyen modellosztályunk a felhasználó számára:

public class User {
private String firstName;
private String lastName;
private int age;
}

És ahelyett, hogy ennek az osztálynak az objektumait konstruktorokkal hoznánk létre, a Builder mintával szeretnénk létrehozni őket, így:

new User.Builder()
.setFirstName("Leonardo")
.setLastName("da Vinci")
.setAge(67)
.create();

Hogyan tudjuk ezt megvalósítani? Először is, létre kell hoznunk a Builder osztályt a User osztályon belül, amely tartalmazni fogja az objektumunk felépítéséhez szükséges metódusokat. A láncoló metódusok meglétének kulcsa, hogy a builder metódusok a Builder osztályt adják vissza. Nézzük meg a példát:

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);
}
}

Minden paraméterhez van egy setterünk – a különbség az, hogy ezek a metódusok Builder típust adnak vissza. A végén van egy metódusunk, amely a User osztály konstruktorát használja, és a User objektumot adja vissza – itt van az a hely, ahol a rendetlenségünket rejtve tartjuk.

Ezután a User modellosztály összes paraméterével konstruktort kell létrehoznunk :

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;
}
}

A fontos dolog itt az, hogy a User konstruktor privát, tehát nem lehet elérni a másik osztályból, és a Builder-t kell használnunk az új objektum létrehozásához.

A paraméterek egy részét persze kötelezővé tehetjük (mivel egyelőre mindegyik opcionális), ha módosítjuk a create() metódusunkat, és dobunk néhány kivételt, például:

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;
}

Ez minden. Így létrehoztuk a User.Builder() osztályunkat!

Builder – protip

Ha elég türelmes voltál, hogy végigolvasd az egész blogbejegyzést, van egy tippem a Builder mintával kapcsolatban: az IntelliJ segítségével létrehozhatod a teljes Builder osztályt!

Mindössze annyit kell tenned, hogy a caretet az osztályodban lévő konstruktorra helyezed, és a Refactor -> Replace Constructor with Builder menüpontot választod a kontextusmenüben. A Builder osztály az összes metódussal együtt automatikusan generálódik, használatra készen.

Bővebben itt olvashat: IntelliJ: Replace Constructor with Builder

Következtetés

A Builder minta egy nagyszerű megközelítés, nem csak a modellosztályokhoz, hanem minden olyan objektumhoz, amelynek több mint három vagy négy paramétere van. Egy kis pluszmunkával növelhetjük a kódunk olvashatóságát. A tervezési mintákat a legjobb gyakorlatként ismerik el, ezért nagy előny, ha ismerünk közülük néhányat, és a Builder egy jó kiindulási alap

.