# Tipp: Eclipse Builder Pattern Plugin



## byte (7. Jul 2009)

Hi allerseits,

für alle tippfaulen Freunde von J. Blochs Builder Pattern habe ich was sehr interessantes entdeckt: Eclipse Builder Pattern Plugin - Overview

Damit lässt sich der Sourcecode eines Builder komfortabel automatisch erzeugen. Einfach Rechtsklick auf eine Klasse -> _Source _->_ Generate Builder Pattern Code_. Dann kann man auswählen, für welche Member der Code generiert werden soll.

Komischerweise fehlt der Menü-Eintrag, wenn man auf Source im Menü geht oder wenn man den Shortcut dafür drückt.

Viel Spaß damit.

byto


----------



## Marco13 (7. Jul 2009)

Hm - das Pattern "kenne" ich eigentlich, und das Beispiel von Bloch hatte ich schon vor einer ganzen Weile gesehen, aber ... als ich eben das andere Beispiel mit dem "User" angesehen habe, ist mir die Verdopplung _aller_ fields irgendwie negativ aufgefallen. Würde eigentlich was gegen sowas sprechen:

```
class User
{
    private long id;
    private String username;
    private String firstname;
    private String lastname;
    private String email;

    public static class Builder
    {
        private User currentUser = null;

        public Builder()
        {
            currentUser = new User();
        }

        public Builder id(long id)
        {
            currentUser.id = id;
            return this;
        }

        public Builder username(String username)
        {
            currentUser.username = username;
            return this;
        }

        public Builder firstname(String firstname)
        {
            currentUser.firstname = firstname;
            return this;
        }

        public Builder lastname(String lastname)
        {
            currentUser.lastname = lastname;
            return this;
        }

        public Builder email(String email)
        {
            currentUser.email = email;
            return this;
        }

        public User build()
        {
            User result = currentUser;
            currentUser = null;
            return result;
        }
    }

    private User()
    {
    }
}

class UserCreator
{
    public static void main(String[] args)
    {

        User user = new User.Builder().id(541).username("jsmith").email(
            "john@smith.com").build();

    }
}
```

?! Ist find' ich fast noch hübscher, weil man alle Fields nur ein mal braucht. Das mit den Mandatory/Optional Fields könnte man da wohl auch einbauen. Oder übersehe ich da gerade irgeneinen Grund, warum man das NICHT so machen sollte?! ???:L


----------



## byte (7. Jul 2009)

Mir fällt auch nix auf, was dagegen spricht. Sieht auf jeden Fall kompakter aus.


----------



## Marco13 (7. Jul 2009)

Abgesehen davon, dass es nicht mehr 100% so verwendet werden kann, wie vorher
Builder b = new Builder().foo(xx).bar(xx);
User u0 = b.build();
User u1 = b.build();
aber auch das könnte man nachbauen.

(Es ging mir nur darum, dass das Argument, damit viele setter und Parameter zu sparen gerade dann greift, wenn genau die _Verdopplung_ dieser vielen Fields besonders unschön ist...)


----------



## Machtin (13. Nov 2009)

Das Problem ist, dass man die Klasse so nicht mehr immutable machen kann.


----------



## Marco13 (13. Nov 2009)

Sicher kann man das - und das kann man nicht nur, in dem Beispiel IST die Klasse ja auch immutable: Die Fields sind private, und werden nur von der (privaten, inneren) Builder-Klasse gesetzt - während des Bauens, und danach nicht mehr.


----------

