Cuvântul cheie tranzitoriu în Java

1. Introducere

În acest articol, vom înțelege mai întâi cuvântul cheie tranzitoriu și apoi vom vedea comportamentul acestuia prin exemple.

2. Utilizarea tranzitorilor

Să înțelegem mai întâi serializarea înainte de a trece la tranzitorii , deoarece este utilizată în contextul serializării.

Serializarea este procesul de conversie a unui obiect într-un flux de octeți, iar deserializarea este opusul acestuia .

Când marchăm orice variabilă ca tranzitorie, atunci acea variabilă nu este serializată . Prin urmare, procesul de serializare ignoră valoarea inițială a variabilelor și salvează valorile implicite pentru acel tip de date.

Cuvântul cheie tranzitoriu este util în câteva scenarii:

  • Îl putem folosi pentru câmpuri derivate
  • Este util pentru câmpurile care nu reprezintă starea obiectului
  • Îl folosim pentru orice referințe neserializabile

3. Exemplu

Pentru a o vedea în acțiune, să creăm mai întâi o clasă de carte al cărei obiect am dori să-l serializăm:

public class Book implements Serializable { private static final long serialVersionUID = -2936687026040726549L; private String bookName; private transient String description; private transient int copies; // getters and setters }

Aici, am marcat descrierea și copiile ca câmpuri tranzitorii .

După crearea clasei, vom crea un obiect al acestei clase:

Book book = new Book(); book.setBookName("Java Reference"); book.setDescription("will not be saved"); book.setCopies(25);

Acum, vom serializa obiectul într-un fișier:

public static void serialize(Book book) throws Exception { FileOutputStream file = new FileOutputStream(fileName); ObjectOutputStream out = new ObjectOutputStream(file); out.writeObject(book); out.close(); file.close(); }

Să deserializăm obiectul acum din fișier:

public static Book deserialize() throws Exception { FileInputStream file = new FileInputStream(fileName); ObjectInputStream in = new ObjectInputStream(file); Book book = (Book) in.readObject(); in.close(); file.close(); return book; }

În cele din urmă, vom verifica valorile obiectului de carte :

assertEquals("Java Reference", book.getBookName()); assertNull(book.getDescription()); assertEquals(0, book.getCopies());

Aici vedem că bookName a fost persistat în mod corespunzător. Pe de altă parte, câmpul de copii are valoarea 0 și descrierea este nulă - valorile implicite pentru tipurile lor de date respective - în locul valorilor originale.

4. Comportament cu final

Acum, să vedem un caz special în care vom folosi tranzitoriu cu cuvântul cheie final . Pentru aceasta, mai întâi, vom adăuga un ultim element tranzitoriu în clasa noastră de carte și apoi vom crea un obiect de carte gol :

public class Book implements Serializable { // existing fields private final transient String bookCategory = "Fiction"; // getters and setters }
Book book = new Book();

Când verificăm valorile după deserializare, vom observa că tranzitorul a fost ignorat pentru acest câmp și valoarea inițială a fost persistată :

assertEquals("Fiction", book.getBookCategory());

5. Concluzie

În acest articol, am văzut utilizarea cuvântului cheie tranzitoriu și comportamentul acestuia în serializare și deserializare. De asemenea, am văzut comportamentul său diferit cu cuvântul cheie final .

Ca întotdeauna, tot codul este disponibil pe GitHub.