Pourquoi Java a-t-il des champs transitoires?


5 Answers

Avant de comprendre le mot-clé transient , il faut comprendre le concept de sérialisation. Si le lecteur connaît la sérialisation, ignorez le premier point.

Qu'est-ce que la sérialisation?

La sérialisation est le processus consistant à rendre l'état de l'objet persistant. Cela signifie que l'état de l'objet est converti en un flux d'octets et stocké dans un fichier. De la même manière, nous pouvons utiliser la désérialisation pour ramener l'état de l'objet à partir des octets. C'est l'un des concepts importants de la programmation Java, car la sérialisation est principalement utilisée dans la programmation en réseau. Les objets qui doivent être transmis à travers le réseau doivent être convertis en octets. Pour ce faire, chaque classe ou interface doit implémenter l'interface Serializable . C'est une interface de marqueur sans aucune méthode.

Maintenant, quel est le mot-clé transient et son but?

Par défaut, toutes les variables de l'objet sont converties en un état persistant. Dans certains cas, vous pouvez éviter de conserver certaines variables car vous n'avez pas besoin de les conserver. Vous pouvez donc déclarer ces variables comme transient . Si la variable est déclarée transient , elle ne sera pas persistante. C'est l'objectif principal du mot-clé transient .

Je veux expliquer les deux points ci-dessus avec l'exemple suivant:

package javabeat.samples;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class NameStore implements Serializable{
    private String firstName;
    private transient String middleName;
    private String lastName;

    public NameStore (String fName, String mName, String lName){
        this.firstName = fName;
        this.middleName = mName;
        this.lastName = lName;
    }

    public String toString(){
        StringBuffer sb = new StringBuffer(40);
        sb.append("First Name : ");
        sb.append(this.firstName);
        sb.append("Middle Name : ");
        sb.append(this.middleName);
        sb.append("Last Name : ");
        sb.append(this.lastName);
        return sb.toString();
    }
}

public class TransientExample{
    public static void main(String args[]) throws Exception {
        NameStore nameStore = new NameStore("Steve", "Middle","Jobs");
        ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("nameStore"));
        // writing to object
        o.writeObject(nameStore);
        o.close();

        // reading from object
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("nameStore"));
        NameStore nameStore1 = (NameStore)in.readObject();
        System.out.println(nameStore1);
    }
}

Et la sortie sera la suivante:

First Name : Steve
Middle Name : null
Last Name : Jobs

Le deuxième prénom est déclaré comme transient , il ne sera donc pas stocké dans le stockage persistant.

Source

Question

Pourquoi Java a-t-il des champs transitoires ?




selon google transitoire sens == ne dure que pour une courte période; transitoire.

Maintenant, si vous voulez faire quoi que ce soit de transitoire en Java, utilisez le mot-clé transitoire.

Q: où utiliser transitoire?

R: En général, dans Java, nous pouvons enregistrer des données dans des fichiers en les acquérant dans des variables et en les écrivant dans des fichiers. Ce processus est connu sous le nom de sérialisation. Maintenant, si nous voulons éviter que des données variables soient écrites dans un fichier, nous rendrions cette variable transitoire.

résultat transitoire int = 10;

Remarque: les variables transitoires ne peuvent pas être locales.




Avant de répondre à cette question, je dois vous expliquer la SERIALISATION , car si vous comprenez ce que signifie la sérialisation dans un ordinateur scientifique, vous pouvez facilement comprendre ce mot-clé.

Sérialisation Lorsqu'un objet est transféré via le réseau / enregistré sur un support physique (fichier, ...), l'objet doit être "sérialisé". La sérialisation convertit la série d'objets d'état d'octets. Ces octets sont envoyés sur le réseau / sauvegardés et l'objet est recréé à partir de ces octets.
Exemple

public class Foo implements Serializable 
{
 private String attr1;
 private String attr2;
 ...
}

Maintenant SI VOUS VOULEZ NE PAS TRANSFERT / SAUVEGARDER le champ de cet objet SO , vous pouvez utiliser le mot-clé transient

private transient attr2;

Example




transient est utilisé pour indiquer qu'un champ de classe n'a pas besoin d'être sérialisé. Probablement le meilleur exemple est un champ Thread . Il n'y a généralement aucune raison de sérialiser un Thread , car son état est très spécifique au flux.




Ma petite contribution:

Quelle est la variable transitoire en Java?
En simple phrase toute variable qui est modifiée avec le mot-clé transitoire devient variable transitoire en Java.

Pourquoi avons-nous besoin d'une variable transitoire en Java?
Le mot clé Transient vous permet de contrôler le processus de sérialisation et vous permet d'exclure certaines propriétés d'objet du processus de sérialisation. Il est parfois utile de ne pas sérialiser certains attributs d'un objet, nous verrons quelles variables ne devraient pas être sérialisées et devraient être rendues transitoires dans la section suivante.

Quelle variable vous devriez marquer transitoire?
Puisque nous connaissons le but du mot-clé transitoire ou que nous avons une variable transitoire, il est logique de penser à quelle variable doit être marquée comme transitoire. Ma règle est que toute variable dont la valeur peut être calculée à partir d'autres variables n'a pas besoin d'être sauvegardée. Par exemple, si vous avez un champ appelé "intérêt" dont la valeur peut être dérivée d'autres champs, par exemple, principe, taux, temps, etc., il n'est pas nécessaire de le sérialiser.
Un autre exemple est le nombre de mots, si vous enregistrez un article, il n'est pas nécessaire d'enregistrer le nombre de mots, car il peut être créé lorsque l'article est désérialisé. Un autre bon exemple de mot-clé transitoire est "Logger" puisque la plupart du temps vous avez une instance de logger pour vous connecter en Java mais vous ne voulez certainement pas qu'il sérialise correctement?




Les systèmes de sérialisation autres que Java peuvent également utiliser ce modificateur. Hibernate, par exemple, ne conservera pas les champs marqués avec @Transient ou le modificateur de transitoire . La terre cuite respecte aussi ce modificateur.

Je crois que la signification figurative du modificateur est "ce champ est pour une utilisation en mémoire seulement, ne pas persister ou le déplacer en dehors de cette VM particulière de quelque façon que ce soit. c'est-à-dire que vous ne pouvez pas compter sur sa valeur dans un autre espace mémoire VM. Tout comme la volatilité signifie que vous ne pouvez pas compter sur une certaine sémantique de la mémoire et des threads.




Related