Cast ohne neues Object zu erzeugen

Status
Nicht offen für weitere Antworten.

Kaffeebohne

Bekanntes Mitglied
Hallo ich möchte einen Cast machen ohne ein neues Objekt zu erzeugen.

Hintergrund ich habe einen Methodenkopf der als Parameter Object zulässt. Dieses Object ist in Wirklichkeit eine Insantz von bsp. Buch. Die Methode macht irgendwas mit dem Buch und setzt ein paar Werte. Es muss aber genau dieses Buch sein (Referenz)

Wenn ich aber caste muss ich ein neues Objekt erzeugen.

BSP.

Code:
public Object doSomething(Object object) {
	// geht nicht
	object = (Buch)object;
	object.setID(123);
}
 
:? es muss natürlich: Buch buch = (Buch) object; buch.set... heißen 🙂
 
Probiere es doch mal so:
Code:
public Object doSomething(Object object) {
   // sollte gehen
   ((Buch)object).setID(123);
}

Geht natürlich in die Hose, wenn der Cast fehlschlägt.
 
@roar

Genau das wollte ich ja vermeiden 🙂 , da wenn der das Objekt mit Werten füllt und bei einem Fehlschlag eine Exception wirft, ich dann aber die bisherigen Daten weiterverarbeiten kann wenn es sich um eine Refernez handelt (Ich weiss Java arbeitet nur mit Referenzen, denke aber du weisst was ich mit dieser Aussage meine.)

@willi69

Hmm hab das gerade in Netbeans reingehauen - Leider geht das nicht die IDE sagt:

unexpected type
required variable
found value
 
Kaffeebohne hat gesagt.:
Genau das wollte ich ja vermeiden 🙂 , da wenn der das Objekt mit Werten füllt und bei einem Fehlschlag eine Exception wirft, ich dann aber die bisherigen Daten weiterverarbeiten kann wenn es sich um eine Refernez handelt (Ich weiss Java arbeitet nur mit Referenzen, denke aber du weisst was ich mit dieser Aussage meine.)
ne, ich versteh den satz nich :? :autsch:
bei
Buch buch = (Buch) object
wird kein neues objekt angelegt.
es passiert in der vm genau das gleiche wie wenn du sagst
o = (Buch) object
oder
((Buch) object).set..
 
Sorry, ich hatte den return-Type der Methode übersehen.

Code:
    public Object doSomething(Object obj) {
        ((Buch)obj).setId(123);
        return obj;
    }

Was aber eigentlich "suboptimal" ist. Einfacher:

Code:
    public void doSomething(Object obj) {
        ((Buch)obj).setId(123);
    }

Es kommt aber, wie so häufig im Leben, auf den konkreten Zweck an.
 
ich hoffe die Methode ist noch ein wenig komplexer, da ansonsten die verwendung von Object fragwürdig ist....
 
Danke funktioniert. 🙂

@roar
Du hast recht, es wird kein neues Objekt erzeugt 😎


@wili69
Denke hier ist es gut angebracht.

Weil

@deathbyaclown
die Methode ein Teil einer Strategie ist und die Klassen die die Strategie implementieren sollen nicht zig tausend überladene Methoden haben.
 
Kaffeebohne hat gesagt.:
@deathbyaclown
die Methode ein Teil einer Strategie ist und die Klassen die die Strategie implementieren sollen nicht zig tausend überladene Methoden haben.
dann hoff ich eine gut überlegte Strategie... genauso unsinnig ist es zig instanceof o.ä. abfragen zu machen, um dann die nötigen casts in der methode zu haben....
 
Denke schon,

es wird nur einmal pro Strategy geinstanced und gecasted. Das finde ich im Austausch für Modularität und Flexiblität durchaus akzeptabel.
 
Kaffeebohne hat gesagt.:
@roar
Du hast recht, es wird kein neues Objekt erzeugt 😎

Präziser: Es wird eine neue Referenz erzeugt, diese zeigt jedoch auf das selbe Objekt im Speicher. Mehr dazu siehe FAQ.


deathbyaclown hat gesagt.:
dann hoff ich eine gut überlegte Strategie... genauso unsinnig ist es zig instanceof o.ä. abfragen zu machen, um dann die nötigen casts in der methode zu haben....

Stimmt natürlich, aber häufig lässt es sich nich vermeiden, wenn man auf schon fertige generische Komponenten oder Frameworks zurückgreift. Die meisten sind leider noch nicht auf Generics umgestellt.
 
byto hat gesagt.:
deathbyaclown hat gesagt.:
dann hoff ich eine gut überlegte Strategie... genauso unsinnig ist es zig instanceof o.ä. abfragen zu machen, um dann die nötigen casts in der methode zu haben....

Stimmt natürlich, aber häufig lässt es sich nich vermeiden, wenn man auf schon fertige generische Komponenten oder Frameworks zurückgreift. Die meisten sind leider noch nicht auf Generics umgestellt.
Interfaces ?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben