Meistens erzeugt man Objekte in Java mit new. Es gibt aber noch ein paar andere Möglichkeiten.
Wir haben diese Farbe Testklasse:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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.