# Blöde(?) Frage zu Konstruktoren und set-Methoden



## daNny (13. Feb 2008)

Hi Ihr!

Ich hätte da jetzt einmal ne generelle Frage, wie ich hier am besten vorgehe:
Ich nehme nun einmal an, ich habe eine Klasse Benutzer. Ein Benutzer hat eine ID und einen Namen. Eine mögliche, einfache Klasse sähe ja nun so aus:


```
public class Benutzer {
    
    /**
      * Die ID des Benutzers
      */
    private int id;

    /**
      * Der Name des Benutzers
      */
    private String name;

    /**
     * Erzeugt einen neuen Benutzer
     */
    public Benutzer(int id, String name) {
        this.id = id;
        this.name = name;
    }

    /*
     * Gibt die ID des Benutzers zurück
     * @return die ID
     */
    public int getId() {
        return this.id;
    }
    
    /*
     * Setzt die ID des Benutzers
     * @param id die ID
     */
    public void setId(int id) {
        this.id = id;
    }

    /*
     * Gibt den Namen des Benutzers zurück
     * @return der Name
     */
    public String getName() {
        return this.name;
    }
   
    /*
     * Setzt den Namen des Benutzers
     * @param name der Name
     */
    public void setName(String name) {
        this.name = name;
    }
}
```

Das ist ja nun eine recht einfach gehaltene Klasse. Jetzt kommt es aber zu meiner Frage: Es kommt ja häufig vor, dass man die übergebenen Werte zunächst überprüfen möchte, bevor man die Werte den Objekt-Attributen zuweist. Ein Benutzername soll z.B. mindestens aus n Zeichen bestehen etc. Das regelt man dann ja meistens in den set-Methoden.
Wenn meine Bedingung nun ist, dass ein Benutzername aus mindestens 3 Zeichen bestehen sollte, könnte ich meine setName() ja so abändern:

```
public void setName(String name) {
    if (name != null && name.length() > 2) {
        this.name = name;
    }
}
```

Sollte ich für den Fall, dass der Name nun weniger als 3 Zeichen hat, eine Exception werfen, oder sollte ich die Methode diese Unart einfach stillschweigend dahinnehmen lassen? Und um auf meine eigentliche Frage zu kommen:
Sollte man für diese Fälle dann im Konstruktor auch immer die setMethode zum setzen des Wertes verwenden? Denn in fast allen Tutorials wird der Parameter des Konstruktors ohne jegliche Überprüfung immer den Attributen zugeordnet, also so, wie ich es oben in der Benutzer-Klasse habe. Sollte das ganze dann nicht besser so aussehen?:


```
public Benutzer (int id, String name) {
    setId(id);
    setName(name);
}
```

Wäre nett, wenn der ein oder andere mal was dazu sagen könnte 

Danke!

daNny


----------



## maki (13. Feb 2008)

Ja 

Eine IllegalArgumentException in der Set Methode wäre IMHO richtig.

Um den Code zur Überprüfung nicht 2 mal zu schreiben (DRY Prinzip), sollte die set Methode aus dem konstreuktor aufgerufen werden, so wie du es vorgeschlagen hattest.


----------



## daNny (13. Feb 2008)

Suppi! Danke schön!

Das war's auch schon, was ich wissen wollte


----------



## Lim_Dul (13. Feb 2008)

Wenn schon, die Validierung in eine eigene private methode auslagern.

Grund: Non final public Methoden sollte man nach möglichkeit nicht in einem Konstruktur aufrufen. Oder wer kann mir die Antwort geben, was passiert, wenn man in einer Subklasse die set-Methode überschreibt?

Hier ist ein Beispiel, was zwar anders geartet gestrickt ist, aber dennoch Probleme verdeutlicht:
http://blog.platinumsolutions.com/node/128


----------

