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é?
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
.
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é.
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 Wrapper
s, 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. :-)
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.