# Unterschied Konstruktor / Getter Setter



## Leno (14. Dez 2010)

Hi an die Java Götter ! 

ich habe ein Problem mit dem OOP Ansatz. Als folgendes verstehe Ich nicht ganz, also ein Konstruktor kann dazu genutzt werden um ein Objekt zu erzeugen , Ich kann auch Werte übergeben an den Konstruktor OK ! Und eine Getter / Setter Methode wird im Zusammenhang mit Datenkapselung ( Private ) genutzt um Werte zu setzen und zu bekommen! OK brauche Ich dan noch einen Konstruktor ??? wenn Ich sowie Werte über Getter / Setter setzen kann. 


```
class Auto {

	public int sitze;
	public String marke;
	public int geschwindigkeit;

	// Konstruktor ohne Parameterliste. Wird kein Konstruktor angegeben so
	// erzeugt Java einen Default Konstruktor.

	public Auto() {

		sitze = 0;
		marke = "unbekannt";
		geschwindigkeit = 0;

	}

	// Konstruktor mit Parameterliste !

	public Auto(int neue_anzahl_sitze, String neue_marke,
			int neue_geschwindigkeit) {

		sitze = neue_anzahl_sitze;
		marke = neue_marke;
		geschwindigkeit = neue_geschwindigkeit;

	}

}

// Neue Objekte werden mihilfe des new Operators + eines Konstruktors erzeugt! 


public class Beispiel_für_Konstruktor {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Auto auto1 = new Auto(2, "BMW", 200); // Erzeugt eine neues Objekte auto
												// und ruft den Konstruktor
												// den man selber definieren
												// kann auf.
		System.out.println(auto1.geschwindigkeit);
		System.out.println(auto1.marke);
		System.out.println(auto1.sitze);

		Auto auto2 = new Auto(4, "Audi", 240);

		System.out.println(auto2.geschwindigkeit);
		System.out.println(auto2.marke);
		System.out.println(auto2.sitze);

		Auto auto3 = new Auto();

		System.out.println(auto3.geschwindigkeit);
		System.out.println(auto3.marke);
		System.out.println(auto3.sitze);

	}

}
```


Kann mir jemand sagen wie Ich hier im Quellecode eine Getter / Setter Methode einbaue und wozu Ich das ganze nutzen kann ??

MFG LENO


----------



## FArt (14. Dez 2010)

java constructor vs setter - Google-Suche


----------



## ARadauer (14. Dez 2010)

> OK brauche Ich dan noch einen Konstruktor ???


naja man kann somit den Benutzer der Klasse dazu zwingen das er beim erzeugen des Objekts schon ein Argument übergibt.


----------



## Dit (14. Dez 2010)

Wenn du keinen Konstruktor schreibst, hat die Klassen natürlich trotzdem einen "unsichtbaren" Konstruktor ohne übergabeparameter, damit eine Klasse erzeugt werden kann. 

So gesehen kannst du den Konstruktor weg lassen. Aber man kann natürlich nicht sagen, wenn man Methoden hat die Variablen übergeben bekommen, man den Konstruktor weg lassen kann. 
Das kann natürlich auch unabhängig voneinander sein.


----------



## Gast2 (14. Dez 2010)

Dit hat gesagt.:


> Wenn du keinen Konstruktor schreibst, hat die Klassen natürlich trotzdem einen "unsichtbaren" Konstruktor ohne übergabeparameter, damit eine Klasse erzeugt werden kann.



Das ist kein "unsichtbarer" Konstruktor sondern der "default constructor". Der wird vom Compiler eingefügt wenn kein anderer Konstruktor explizit ausprogrammiert ist, siehe auch:
Classes



Dit hat gesagt.:


> So gesehen kannst du den Konstruktor weg lassen. Aber man kann natürlich nicht sagen, wenn man Methoden hat die Variablen übergeben bekommen, man den Konstruktor weg lassen kann.
> Das kann natürlich auch unabhängig voneinander sein.



Das eine hat nur bedingt was mit dem anderen zu tun. Die Frage ist meiner Meinung nach eher: Will man ein Object erzeugen das schon direkt bei dem Konstruktoraufruf die Membervariablen belegt oder will man ein leeres Object erzeugen und die Werte später setzen.


----------



## Dit (14. Dez 2010)

fassy hat gesagt.:


> Das ist kein "unsichtbarer" Konstruktor sondern der "default constructor". Der wird vom Compiler eingefügt wenn kein anderer Konstruktor explizit ausprogrammiert ist, siehe auch:
> Classes
> 
> 
> ...



Mir sind die Sachen bewusst  hatte auch erst das Wort Default Konstruktor verwendet, dennoch passt für mich auch der Begriff "unsichtbarer", da er ja nicht da ist 

aber ich stimme dir zu!

EDIT: mit dem zweiten Satz sprichst du ja genau das an, was unser vorredner schon geschrieben hat! du zwingst den Benutzer der Klasse übergabe parameter zu setzen!

EDIT2: Das sagt natürlich aus, wenn du einen Konstruktor hast mit übergabeparametern überschreibst du den defaultkonstruktor! (daher auch jem. zwingen parameter zu setzen)


----------



## FArt (14. Dez 2010)

Zwingen hört sich so negativ an... fordern wäre besser... sinnvoll bei immutable objects.

Gründe für die eine oder andere Variante: immutable objects, dependency injection, lazy initialisation, object pooling, java beans, ... (siehe eben obigen Link)


----------



## Dit (14. Dez 2010)

Leno hat gesagt.:


> Kann mir jemand sagen wie Ich hier im Quellecode eine Getter / Setter Methode einbaue
> 
> MFG LENO




```
public int getSitze(){
    return sitze;
  }

  public void setSitze(int sitze){
    this.sitze = sitze;
  }
```

und dann macht man aber überlicherweiße die Variablen Sichtbarkeit auf 
	
	
	
	





```
private
```
 

```
private int    sitze;
```

sonst kann ja jeder die getter/setter umgehen!



Leno hat gesagt.:


> ...wozu Ich das ganze nutzen kann ??



Wie du schon beschrieben hast, macht man das der Sichtbarkeitshalber. Der Vorteil ist, das die Nutzer deiner Klasse GEFORDERT ^^ werden deine "getter" und "setter" zu benutzen und du dort noch z.B. Fehlerbehandlungen vornehmen kannst. 

Beispiel:


```
public int getSitze(){
    return sitze;
  }

  public void setSitze(int sitze){
    if (sitze == 1){
      System.out.println("Dieser Wert ist hier nicht erlaubt");
    }else{
      this.sitze = sitze;
    }
  }
```


----------



## Gast2 (14. Dez 2010)

Noch ein Spitzfindigkeit (nichts gegen dich Dit):

Der Default Konstruktor wird nicht überschrieben wenn man einen eigenen definiert. Sondern es wird einfach keiner mehr von dem Compiler eingefügt. Überschreiben gilt im Zusammenhang mit Vererbung -> @Override

Recht wichtige Begriffe die sich der TO mal anschauen könnte:
Abstrakter Datentyp ? Wikipedia
Datenkapselung (Programmierung) ? Wikipedia
Polymorphie (Programmierung) ? Wikipedia


----------



## Dit (14. Dez 2010)

Ich habe mir Java selbst in der Ausbildung beigebracht, und genau solche Sachen ließt man nicht! Daher bin ich froh, wenn solche Details nochmal erläutert werden 

ich nehm sowas gerne auf!!


----------



## stareagle (14. Dez 2010)

Hallo,

was bisher noch nicht erwähnt wurde: Sobald du eine Collection (oder andere komplexe Objekte) in deinem Objekt verwendest, brauchst du einen Konstruktor, um diese Collection zu erzeugen. Denn sonst kommt beim ersten Zugriff auf die Collection eine NullPointerException. Einzige Alternative wäre bei einem Zugriff auf die Collection jedes mal zu prüfen, ob die Collection noch 
	
	
	
	





```
null
```
 ist. Beispiel:


```
package net.example;

import java.util.List;
import java.util.ArrayList;

public class SchoolClass {

  private String name;
  private List<Pupil> pupils;

  public SchoolClass {
    pupils = new ArrayList<Pupil>();
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public List<Pupil> getPupils() {
    return pupils;
  }

  public void setPupils(List<Pupil> pupils) {
    this.pupils = pupils;
  }

  public void addPupil(Pupil pupil) {
    pupils.add(pupil);
  }
}
```

Wenn die 
	
	
	
	





```
List
```


```
pupils
```
 nicht im Konstruktor initialisiert würde, würde man in Zeile 32 eine NPE bekommen.

Gruß

Stareagle


----------



## Gast2 (14. Dez 2010)

```
Hallo,

was bisher noch nicht erwähnt wurde: Sobald du eine Collection (oder andere komplexe Objekte) in deinem Objekt verwendest, brauchst du einen Konstruktor, um diese Collection zu erzeugen. Denn sonst kommt beim ersten Zugriff auf die Collection eine NullPointerException. Einzige Alternative wäre bei einem Zugriff auf die Collection jedes mal zu prüfen, ob die Collection noch null ist.
```
Öhm... was spricht dagegen die Liste direkt beim deklarieren zu initialisieren? Wozu brauchst du da zwangsweise nen Kontruktor?


```
public class Foo {
    private List<Apple> list = new ArrayList<Apple>;
   
    public void addApple(Apple apple) {
        list.add(apple);
    }
}
```


----------



## Gast2 (14. Dez 2010)

@stareagle
Das Membervariablen in Objecten nicht initialisiert werden ist ja auch keine Eigenschaft von einem Konstruktor. Man KANN es in einem Konstruktor machen, muss es aber nicht.


----------



## Andi_CH (15. Dez 2010)

stareagle hat gesagt.:


> was bisher noch nicht erwähnt wurde: Sobald du eine Collection (oder andere komplexe Objekte) in deinem Objekt verwendest, brauchst du einen Konstruktor, um diese Collection zu erzeugen.


Käse ;-) das geht auch ohne Konstruktor,wie auch Eike schon tippte.
Den Konstruktor müsste man übrignes mit () schreiben



stareagle hat gesagt.:


> ```
> public class SchoolClass {
> 
> private List<Pupil> pupils = new ArrayList<Pupil>();
> ...


----------

