domingo, 19 de junho de 2011

Dicas de Programação: O que é transient em Java?

Afinal, para que serve a palavra reservada transient?

Hum... Sei lá, deve servir para alguma coisa. :P

Falando sério, serve para deixar a propriedade de uma classe "gravável", não "gravável".

Está bem... Concordo que a explicação ficou meio "tosca". Vamos ao exemplo, que é melhor:

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

public class Usuario implements Serializable {

private static final long serialVersionUID = 2898873189053002193L;
private String username;
//Password é uma propriedade "transient"
private transient String password;

//Construtor da classe
public Usuario(String username, String password) {
this.username = username;
this.password = password;
}

//Método que salva o estado do objeto
public void save() {
ObjectOutputStream output = null;
try {
output = new ObjectOutputStream(new FileOutputStream(hashCode() + ".obj"));
output.writeObject(this);
} catch (IOException e) {
e.printStackTrace();
} finally {
close(output);
}
}

//Fecha o arquivo de saída
private static void close(OutputStream output) {
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}

//Carrega o último estado do objeto salvo
public void load() {
ObjectInputStream input = null;
try {
input = new ObjectInputStream(new FileInputStream(hashCode() + ".obj"));
Usuario usuario = (Usuario)input.readObject();
this.username = usuario.username;
this.password = usuario.password;
} catch (Exception e) {
e.printStackTrace();
} finally {
close(input);
}
}

//Fecha o arquivo de leitura
private static void close(InputStream input) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}

//Transforma o objeto em uma String
public String toString() {
return "Username:" + username + " Password:" + password;
}

//Método principal
public static void main(String[] args) {
//Cria um novo usuário
Usuario usuario = new Usuario("ricardo", "takemura");
//Salva ele
usuario.save();
//Exibe as informações
System.out.println(usuario);
//Carrega ele
usuario.load();
//Exibe as informações
System.out.println(usuario);
}
}

Agora, se executarmos o código acima, veremos que o sistema exibirá as seguintes linhas:

Username:ricardo Password:takemura
Username:ricardo Password:null

Ué... Cadê o valor da password na segunda linha?

Então, é isso que a palavra "transient" significa, ou seja, mesmo que o objeto seja "gravável" (estendendo de "Serializable"), uma propriedade transient não será salva.

Agora, para que isso?

Para informações sigilosas, calculadas ou "não importantes" (e deixar um objeto grávavel custa processamento...).

Deu para entender? :P

Até mais!

Nenhum comentário: