# Transient



## Johns (17. Apr 2009)

Hallo alle,

ich wollte mal nachfragen warum man transient nicht als modifier bei methoden verwenden darf. Bzw. was würde passieren wenn man es doch macht?

gruß

Johns


----------



## Gelöschtes Mitglied 5909 (17. Apr 2009)

1. weißt du was transient macht?
2. macht keinen sinn
3. probier es aus -> warscheinlich compile error


----------



## newcron (17. Apr 2009)

Hallo, 
transient bedeutet nichts anderes, als dass der Wert einer Variable beim Serialisieren (die reinen Binärdaten, die im Speicher liegen irgendwo hin speichern) nicht Mitserialisiert, sondern auf null gesetzt wird. 

Angenommen du hast eine Model-Klasse, die eine Referenz auf die GUI hast und möchtest diese Klasse serialisieren. Verwendest du Transient nicht, werden alle Objekte, auf die deine Model-Klasse eine Referenz hat, mitserialisiert. Bei der GUI willst du das vermutlich eher nicht haben (wozu auch?) In dem fall könntest du die referenz auf das GUI Objekt transient setzen und sie würde nicht mitgespeichert werden. 

Im Gegensatz dazu sind Methoden für den aktuellen Status deiner Klasse nicht von Bedeutung, da sie selbst keinen eigenen Zustand haben. (Du kannst ihr Verhalten per Parametern oder per Feldern [Klassenvariablen] bestimmen.) Um die Klasse zu serialisieren ist es überhaupt nicht notwendig, die Methoden abzuspeichern - die sind in den .class Dateien ohnehin verfügbar.


----------



## Johns (17. Apr 2009)

vielen dank fuer die antworten , mir ist bekannt das transiente variablen nicht mit gespeichert werden dürfen. 


nur leider gibt es beispielsweise inn

Java.util ->  collection. class ganz unten eine methode die Transient ist ... . 

also wird es doch gemacht,  und mir erschließt sich der Sinn auch nicht -.-

wenn man die klasse in e-clipse anschaut wird der "fehler" angemeckert

gruß
Johns


----------



## maki (17. Apr 2009)

Welche Methode ist das denn?


----------



## tfa (17. Apr 2009)

Welche Methode soll denn das sein? Bei mir (JDK1.6) kann ich nichts dergleichen finden.


----------



## Johns (17. Apr 2009)

C:\Program Files (x86)\Java\jre1.5.0_09\lib
Datei :  rt.jar

dort der Pfad ist java.util  und die Klasse heißt Collections.class  ganz unten ist die Methode 

public static transient boolean addAll(...); mit namen 

addAll


gruß
Johns


----------



## tfa (17. Apr 2009)

Bei mir heißt die

public static <T> boolean addAll(...)


----------



## Johns (17. Apr 2009)

hm jetzt weiß ich leider net was das sein soll  : )

gibt es da einen Unterschied ?

ist meins eventuell schlechter Stil oder so was?

gruß

Johns


----------



## ice-breaker (17. Apr 2009)

Deins kann eigentlich nicht sein, die Methodendefinition sollte (und ist) so sein,  wie tfa sie beschrieben hat.


----------



## maki (17. Apr 2009)

Er meint dass da kein Transient dabeisteht 

java.util: Collections.java


----------



## Johns (17. Apr 2009)

naja ich denk mir sowas ja net so einfach aus : ) . hm. kanns vielleicht sein das das erst nach dem Kompilier-vorgang angehaengt wird oder sowas?


----------



## Johns (17. Apr 2009)

hab grad in google nach   "public static transient"  gesucht und in Java-blog-buch

wird die Main-methode auch als transient dekompiliert


edit:

Collections (JML and MultiJava documentation)

hier steht diese methode auch ganz unten (dritt letzte)!


----------



## Ebenius (17. Apr 2009)

Sieht nach nem Fehler im Doclet aus das bei jenem SSVL verwendet wird. Wie auch immer, in der Sun API-Doc ist's richtig: Collections.addAll(java.util.Collection, T...).

Ebenius


----------



## Johns (18. Apr 2009)

naja ich hab java aber von sun heruntergeladen und wenn man diese datei (Collections.class) aus dem jar-archiv holt und dekompiliert dann steht da halt transient so oder so ...



gruß

Johns


----------



## maki (18. Apr 2009)

Johns hat gesagt.:


> naja ich hab java aber von sun heruntergeladen und wenn man diese datei (Collections.class) aus dem jar-archiv holt und dekompiliert dann steht da halt transient so oder so ...


Tut es nicht 

Sieh dir doch mal die Original Sourcen an.


----------



## Spacerat (18. Apr 2009)

Na da hat JAD1.5.8 zugeschlagen würd' ich sagen. JAD1.5.8 kann nur Klassen bis JRE1.4 dekompilieren und dem zufolge auch nichts mit generics anfangen. Deswegen wird ein generischer Rückgabewert einer Methode als transient markiert. Ich vermute mal, das die JVMs ab Version 1.5 das intern so handeln, da generics zur Laufzeit ja wieder blos Objekte sind.


----------



## Johns (19. Apr 2009)

vielen Dank

das hilft weiter!


----------

