Warum hat Java transient Felder?
Antworten
Zu viele Anzeigen?Laut Google transient meaning == nur für kurze Zeit anhaltend; unbeständig.
Wenn Sie nun etwas in Java vergänglich machen wollen, verwenden Sie das Schlüsselwort transient.
F: Wo kann man die Übergangszeit nutzen?
A: Im Allgemeinen können wir in Java Daten in Dateien speichern, indem wir sie in Variablen erfassen und diese Variablen in Dateien schreiben; dieser Prozess wird als Serialisierung bezeichnet. Wenn wir nun vermeiden wollen, dass Variablendaten in eine Datei geschrieben werden, müssen wir die Variable als transient kennzeichnen.
transient int result=10;
Anmerkung: transiente Variablen können nicht lokal sein.
Denn nicht alle Variablen sind serialisierbar.
- Serialisierung und Deserialisierung sind Symmetrieprozesse, andernfalls kann man nicht erwarten, dass das Ergebnis bestimmt ist, in den meisten Fällen sind unbestimmte Werte bedeutungslos;
- Serialisierung und Deserialisierung sind idempotent, d.h. Sie können die Serialisierung so oft durchführen, wie Sie wollen, und das Ergebnis ist das gleiche.
Wenn das Objekt also im Speicher, aber nicht auf der Festplatte existiert, kann das Objekt nicht serialisiert werden, da die Maschine bei der Deserialisierung die Memory Map nicht wiederherstellen kann. Zum Beispiel können Sie nicht serialisieren ein Stream
Objekt.
Sie können keine Serialisierung einer Connection
Objekt, da sein Zustand auch von der Gegenstelle abhängt.
Vereinfachter Beispielcode für transient-keyword.
import java.io.*;
class NameStore implements Serializable {
private String firstName, lastName;
private transient String fullName;
public NameStore (String fName, String lName){
this.firstName = fName;
this.lastName = lName;
buildFullName();
}
private void buildFullName() {
// assume building fullName is compuational/memory intensive!
this.fullName = this.firstName + " " + this.lastName;
}
public String toString(){
return "First Name : " + this.firstName
+ "\nLast Name : " + this.lastName
+ "\nFull Name : " + this.fullName;
}
private void readObject(ObjectInputStream inputStream)
throws IOException, ClassNotFoundException
{
inputStream.defaultReadObject();
buildFullName();
}
}
public class TransientExample{
public static void main(String args[]) throws Exception {
ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("ns"));
o.writeObject(new NameStore("Steve", "Jobs"));
o.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream("ns"));
NameStore ns = (NameStore)in.readObject();
System.out.println(ns);
}
}
Einfach ausgedrückt, schützt das transiente Java-Schlüsselwort Felder vor dem Serialisieren wie ihre nicht-transienten Gegenstücke.
In diesem Codeschnipsel implementiert unsere abstrakte Klasse BaseJob die Schnittstelle Serializable. Wir erweitern von BaseJob, aber wir müssen die entfernten und lokalen Datenquellen nicht serialisieren; wir serialisieren nur die Felder organizationName und isSynced.
public abstract class BaseJob implements Serializable{
public void ShouldRetryRun(){}
}
public class SyncOrganizationJob extends BaseJob {
public String organizationName;
public Boolean isSynced
@Inject transient RemoteDataSource remoteDataSource;
@Inject transient LocalDaoSource localDataSource;
public SyncOrganizationJob(String organizationName) {
super(new
Params(BACKGROUND).groupBy(GROUP).requireNetwork().persist());
this.organizationName = organizationName;
this.isSynced=isSynced;
}
}
Ein Feld, das mit einem transienten Modifikator deklariert wird, nimmt nicht am Serialisierungsprozess teil. Wenn ein Objekt serialisiert (in einem beliebigen Zustand gespeichert) wird, werden die Werte seiner transienten Felder in der seriellen Darstellung ignoriert, während andere Felder als transiente Felder am Serialisierungsprozess beteiligt sind. Das ist der Hauptzweck des Schlüsselworts transient.
- See previous answers
- Weitere Antworten anzeigen