web-dev-qa-db-fra.com

Pourquoi utiliser le mot-clé `transitoire` en java?

J'ai un problème lié à l'utilisation du mot clé transient avant le modificateur private dans Java.

déclaration de variable:

transient private ResourceBundle pageResourceBundle; 

Ma classe ressemble à ceci:

public class LoginViewModel extends AbstractViewModel {

    transient private ResourceBundle pageResourceBundle;

    @AfterCompose
    public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {
        initializeLoginValues();
        boolean timeout = BooleanUtils.toBoolean(getHttpServletRequest().getParameter("timeout"));
        if (timeout) {
            Messagebox.show(pageResourceBundle.getText("MSG_SESSION_HAS_EXPIRED_PLEASE_LOGIN"), pageResourceBundle.getText("LABEL_ALERT"),
                    Messagebox.OK, Messagebox.ERROR);
        }
        view.getPage().setTitle(CsdcLicence.get().getApplicationName());
    }

J'ai quelques questions.

1.Pourquoi utiliser le mot clé transient avant une variable privée?

2. quel est le but de l'utilisation de ce mot-clé?

11
Sitansu

les variables transitoires ne sont jamais sérialisées en Java.

Il marque une variable membre à ne pas être sérialisée lorsqu'elle est persistée dans des flux d'octets. Lorsqu'un objet est transféré via le réseau, l'objet doit être "sérialisé". La sérialisation convertit l'état de l'objet en octets série. Ces octets sont envoyés sur le réseau et l'objet est recréé à partir de ces octets. Les variables membres marquées par le Java mot-clé transitoire ne sont pas transférées, elles sont perdues intentionnellement.

veuillez regarder ce que sérialisation est.? et aussi se référer this

Exemple

public class Foo implements Serializable
{
  private String saveMe;
  private transient String dontSaveMe;
  private transient String password;
  //...
}

Dans l'exemple ci-dessus, dontSaveMe et password ne sont jamais sérialisés car ils sont déclarés comme transient variables.

29
rachana

Et une courte utilisation - cas:
Imaginez exposer un objet utilisateur via un service Web accessible au public. Vous aimeriez certainement exposer les choses comme un surnom, en ligne - état, peut-être un e-mail ou un emplacement. Vous ne voudriez certainement pas exposer le mot de passe que l'utilisateur utilise pour se connecter. Bien que ce mot de passe puisse être une propriété de votre objet utilisateur, il ne doit pas être sérialisé, par exemple lors de la sérialisation de l'objet en une chaîne JSON pour le service Web mentionné.

17
Peter

transient le mot clé suggère que l'objet ne doit pas être sérialiséni persisté. Vous pouvez l'utiliser si vous ne voulez pas sérialiser des objets lourds (tels que Wrappers, par exemple, qui peuvent contenir beaucoup de logique métier).

@Transient l'annotation suggère que l'objet ne devrait pas être persisté (si vous avez joué avec Hibernate, par exemple), mais peut être sérialisé.

J'ai inclus l'explication des annotations, car je me souviens avoir été dérouté par les deux. :-)

7
GGrec

transient est utilisé pour spécifier quelles propriétés d'un objet ne seront pas enregistrées ou sérialisées . Par exemple, lors de l'enregistrement d'un objet dans un fichier, transient spécifie quelles propriétés ou attributs ne seront pas enregistrés dans ce fichier lorsque cet objet est enregistré dans un fichier.

Lorsque l'objet est recréé à partir du fichier, la valeur de cet attribut transient (ou propriété privée) ne sera pas recréée car elle n'a jamais été enregistrée ou sérialisée dans ce fichier. Dans certains cas, vous souhaiterez peut-être éviter de conserver certaines de ces variables ou attributs d'instance privée d'un objet, transient vous permet de le faire.

3
blackpanther