# OO Programmierung



## queenv (22. Jan 2022)

Hallo, ich habe eine kleine Angabe zum implementieren und weiß nicht genau wie ich auf die Antwort komme. 
_"einer eindeutigen, automatisch vergebenen, nicht veränderbaren Kennung. Die Kennung setzt sich aus einem Buchstaben („E“-Einzelunternehmen, „P“-Personengesellschaft, “J“-juristische Person) sowie einer fortlaufenden Nummer, welche bei 1 beginnt, zusammen. Wird zum Beispiel ein Einzelunternehmen, dann eine Personengesellschaft sowie eine juristische Person erzeugt, so hätten diese die folgenden Kennungen: „E1“, „P2“, „J3“. "_

Ich habe überlegt es so zu machen: private final String kennung und im Konstruktor erhöhe ich immer um eins (this.kennung = "" + COUNTER++, die Frage ist nur wie ich die Buchstaben am Besten da rein bekomme? 

Danke für eure Hilfe schon mal vorab!!


----------



## Robert Zenz (22. Jan 2022)

Also ich nehme mal an du hast eine Klasse "Kunde" welche die Kennung erhalten soll?


```
public class Kunde {
    private final String kennung;
    
    public Kunde() {
        super();
        
        kennung = "???"; // TODO
    }
}
```



queenv hat gesagt.:


> Frage ist nur wie ich die Buchstaben am Besten da rein bekomme?



Ich nehme desweiteren an es ist eine Uebungsaufgabe. Daher du musst natuerlich wissen welche Klasse der Kunde ist, da gibt es jetzt zwei Loesungsmoeglichkeiten. Die erste ist ueber Vererbung:


```
public abstract class Kunde {
    private final String kennung;
    
    protected Kunde(String kundenTyp) {
        super();
        
        kennung = kundenTyp + "???"; // TODO
    }
}

public class Einzelunternehmen extends Kunde {
    public Einzelunternehmen() {
        super("E");
    }
}

public class Juristischeperson extends Kunde {
    public Juristischeperson() {
        super("J");
    }
}

public class Personengesellschaft extends Kunde {
    public Personengesellschaft() {
        super("P");
    }
}

// ---

Kunde kunde = new Personengesellschaft();
```

Oder die zweite Moeglichkeit ist, dass du den Typen entweder in Felder in der Klasse haeltst:


```
public class Kunde {
    public static final String EINZELUNTERNEHMEN = "E";
    public static final String JURISTISCHEPERSON = "J";
    public static final String PERSONENGESELLSCHAFT = "P";
   
    private final String kennung;
    
    public Kunde(String kundenTyp) {
        super();
        
        kennung = kundenTyp + "???"; // TODO
    }
}

// ---

Kunde kunde = new Kunde(Kunde.EINZELUNTERNEHMEN);
```

Oder als eigenen Enum:


```
public enum Kundentyp {
    EINZELUNTERNEHMEN("E"),
    JURISTISCHEPERSON("J"),
    PERSONENGESELLSCHAFT("P");
   
    private final String kennungsPraefix;
    
    private Kundentyp(String kennungsPraefix) {
        this.kennungsPraefix = kennungsPraefix;
    }
    
    public final String getKennungsPraefix() {
        return this.kennungsPraefix;
    }
}

public class Kunde {
    private final String kennung;
    
    public Kunde(Kundentyp kundenTyp) {
        super();
        
        kennung = kundenTyp.getKennungsPraefix() + "???"; // TODO
    }
}

// ---

Kunde kunde = new Kunde(Kundentyp.EINZELUNTERNEHMEN);
```

Letzteres hat den Vorteil dass die Typen fix feststehen, und nicht jemand einen Kunden mit dem Praefix "X" erstellt.

Du kannst diese natuerlich diese Moeglichkeiten auch mit einer Fabriksmethode kombinieren:


```
Kunde kunde = Kunde.neuesEinzelunternehmen();
```



queenv hat gesagt.:


> Ich habe überlegt es so zu machen: private final String kennung und im Konstruktor erhöhe ich immer um eins (`this.kennung = "" + COUNTER++;`),


Ja, du kannst in der `Kunde` Klasse einen statischen Zaehler mitschleifen, is fuer die Aufgabe wahrscheinlich das einfachste. Stellt sich nur die Frage, ob je Kundentyp oder global. Wenn Threading ein Thema ist, dann waere die Klasse der Wahl der AtomicInteger.


----------



## queenv (23. Jan 2022)

WOW! Danke das war mega hilfreich, ich glaube das Enum ist in dem Fall am passendsten. Threading habe ich noch nicht durchgenommen, deshalb der counter. 
Danke nochmal!


----------

