# Objekterstellung abbrechen?



## MOEP_BIBER (1. Mrz 2011)

Hallo hab schon wieder ne Frage^^

Wenn man zum Beispiel eine begrenzte Anzahl an Objekten haben möchte, so muss man einen Counter bei Erstellung des Objekts hochzählen lassen, den Konstruktor private machen und die Objekterstellung über eine Methode laufen lassen.

Ist es möglich die Objekterstellung in einem Konstruktor selber abzubrechen?
Also den Konstruktor public zu lassen und dort die Fallunterscheidung vornehmen?

heir nochn bisschen code:


```
private Haustier(String name) {
        this.name = name;
    }

    public static Haustier haustierCreator(String name) {
        if(anzahl < 4) {
            anzahl++;
            return new Haustier(name);
        }
    }
```

so ähnlich mein ich das:

```
public Haustier(String name)
    {
        this.name = name;
        if(anzahl < 4) {
            anzahl++;
            machHaustier(name);
        }
        else
        {
            machKeinHaustier();
        }
    }
```


MfG Biber


----------



## nrg (1. Mrz 2011)

nein, meines Wissens nach nicht. Die Konzeption wäre dann so schon richtig (nehme mal an anzahl ist ein staticattribut von Haustier). getInstance wäre vllt der korrekte Name der Methode.


----------



## SlaterB (1. Mrz 2011)

wenn eine Exception geworfen wird, erhält der Aufrufer kein fertig erstelltes Objekt, 
die evtl. zu setzende Variable bleibt bei null bzw. beim vorherigen Wert,
reicht das?


----------



## Volvagia (1. Mrz 2011)

Klar geht das, du musst nur eine Exeption throwen lassen. 


```
public Haustier(String name) throws RuntimeException
{
	this.name = name;
	if(anzahl >= 4)
		throw new RuntimeException("Cannot create more pets.");
	macheHaustier();
}
```

Die Runtime hat den Vorteil, dass du sie bei Bedarf abfangen kannst, aber nicht gezwungen bist.


----------



## SlaterB (1. Mrz 2011)

ein weitere Vorteil ist, dass man nicht 'throws RuntimeException' an den Konstruktor ranschreiben muss


----------



## nrg (1. Mrz 2011)

ohja, das hatte ich jetzt garnicht bedacht



SlaterB hat gesagt.:


> ein weitere Vorteil ist, dass man nicht 'throws RuntimeException' an den Konstruktor ranschreiben muss


:lol:


----------



## MOEP_BIBER (1. Mrz 2011)

alles klar danke =)

noch ne frage:

sind in einer abstrakten Klasse automatisch alle Methoden abstrakt? nicht oder?
Man kann ja auch eine Klasse abstrakt erklärn ohne dass man auch nur eine Methode abstrakt macht oder?

MfG Biber


----------



## nrg (1. Mrz 2011)

MOEP_BIBER hat gesagt.:


> sind in einer abstrakten Klasse automatisch alle Methoden abstrakt? nicht oder?
> Man kann ja auch eine Klasse abstrakt erklärn ohne dass man auch nur eine Methode abstrakt macht oder?


für den Fall, dass ich in dem Thread noch was richtiges von mir gebe: Ja, das stimmt so 

Eine abstrakte "Klasse" bei der alle Methdoen "abstrakt" sein müssen, ist dann ein Interface aber da kann man sich das "abstrakt" dann auch sparen - weil es eh automatisch alle sind


----------



## XHelp (1. Mrz 2011)

Wenn abstrakte Methoden vorhanden sind, dann muss auch die Klasse abstrakt sein. Aber nicht umgekehrt. Du kannst also auch eine abstrakte Klasse haben, die ganz normale statische Methoden hat.


----------



## MOEP_BIBER (1. Mrz 2011)

XHelp ich denke einmal hast du anstatt Methode Klasse geschrieben aber ich verstehs^^
Danke für alle Antworten. =)


----------



## XHelp (1. Mrz 2011)

Ja, Tatsache. Hab es nun geändert


----------

