Welche Möglichkeiten der Java Objekt-Erzeugung gibt es?

Meistens erzeugt man Objekte in Java mit new. Es gibt aber noch ein paar andere Möglichkeiten.

Urlaub

Wir haben diese Farbe Testklasse:

package de.wenzlaff.mqtt.client;

import java.io.Serializable;

/**
 * Farben Klasse.
 * 
 * @author Thomas Wenzlaff
 *
 */
public class Farbe implements Cloneable, Serializable {

	private static final long serialVersionUID = 8660877851154300583L;

	private String farbe = "rot";

	public Farbe() {
		System.out.println("Konstruktor aufruf");
	}

	public String getFarbe() {
		return farbe;
	}

	public void setFarbe(String farbe) {
		this.farbe = farbe;
	}

	@Override
	public String toString() {
		return "Farbe: " + farbe + " mit HashCode=" + hashCode() + "\n";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((farbe == null) ? 0 : farbe.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Farbe other = (Farbe) obj;
		if (farbe == null) {
			if (other.farbe != null)
				return false;
		} else if (!farbe.equals(other.farbe))
			return false;
		return true;
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}

}

und haben diese Möglichkeiten Objekte zu erzeugen.

package de.wenzlaff.mqtt.client;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Constructor;

/**
 * Beispiel für die unterschiedlichen Möglichkeiten der Objekterzeugung.
 * 
 * @author Thomas Wenzlaff
 *
 */
public class NeueObjekte {

	private static final String FARBE_DATEI = "farbe.obj";

	public static void main(String[] args) throws Exception {

		// es wird ein neues Objekt erzeugt, und implizit der Konstruktor ohne
		// Parameter aufgerufen, das ist der normale Weg
		Farbe eins = new Farbe();
		eins.setFarbe("erste Test Farbe");

		System.out.println("1. Test: " + eins);

		// es geht aber auch über die newInstance der Class Klasse über
		// Reflections
		// hier kann es zu einer java.lang.ClassNotFoundException kommen
		Farbe zwei = (Farbe) Class.forName("de.wenzlaff.mqtt.client.Farbe").newInstance();
		zwei.setFarbe("zweite Test Farbe");

		System.out.println("2. Test: " + zwei);

		// 3. Möglichkeit
		Farbe drei = Farbe.class.newInstance();
		drei.setFarbe("dritte Test Farbe");

		System.out.println("3. Test: " + drei);

		// oder über newInstance mit getConstructor
		Constructor<Farbe> konstruktor = Farbe.class.getConstructor();
		Farbe vier = konstruktor.newInstance();
		vier.setFarbe("vierte Test Farbe");

		System.out.println("4. Test: " + vier);

		// oder mit Clone, dann muss die Klasse aber Cloneable implementieren,
		// es wird aber kein Konstruktor aufgerufen!
		Farbe fuenf = (Farbe) vier.clone();
		fuenf.setFarbe("fünfte Test Farbe");

		System.out.println("5. Test: " + fuenf);

		// oder über Serialisation, dann muss die Klasse aber Serializable
		// implementieren sonst kommt eine java.io.NotSerializableException

		// zuerst mal ein Farb Objekt in eine Datei speichern
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(FARBE_DATEI));
		eins.setFarbe("sechste Test Farbe");
		out.writeObject(eins);
		out.close();

		// und das Serialisierte Objekt, als Farbe einlesen, es wird auch kein
		// Konstruktor aufgerufen!
		ObjectInputStream in = new ObjectInputStream(new FileInputStream(FARBE_DATEI));
		Farbe sechs = (Farbe) in.readObject();
		in.close();

		System.out.println("6. Test: " + sechs);
	}

}

Das Ergebniss ist:

Konstruktor aufruf
1. Test: Farbe: erste Test Farbe mit HashCode=-1239076332

Konstruktor aufruf
2. Test: Farbe: zweite Test Farbe mit HashCode=-1601416519

Konstruktor aufruf
3. Test: Farbe: dritte Test Farbe mit HashCode=1712274465

Konstruktor aufruf
4. Test: Farbe: vierte Test Farbe mit HashCode=-122237158

5. Test: Farbe: fünfte Test Farbe mit HashCode=120364780

6. Test: Farbe: sechste Test Farbe mit HashCode=-1862501858

Kennt Ihr noch andere Möglichkeiten? Dann bitte posten oder liken.

Ähnliche Artikel:

  1. Generische Methoden
  2. Java Rätsel des Monats
  3. String „Fri Feb 05 17:15:59 CET 2010“ in Date Objekt umwandeln

wallpaper-1019588
Wie laut wird eine Wärmepumpe?
wallpaper-1019588
[Comic] Something is killing the children [6]
wallpaper-1019588
Helck: Cover des ersten Volumes und Sammelschubers enthüllt
wallpaper-1019588
AKIBA PASS TV: Erste Simulcasts für Sommer 2024 angekündigt