field Por que Java tem campos transitórios?





6 Answers

Antes de compreender a palavra-chave transient , é preciso entender o conceito de serialização. Se o leitor souber sobre serialização, pule o primeiro ponto.

O que é serialização?

Serialização é o processo de tornar o estado do objeto persistente. Isso significa que o estado do objeto é convertido em um fluxo de bytes e armazenado em um arquivo. Da mesma forma, podemos usar a desserialização para recuperar o estado do objeto dos bytes. Esse é um dos conceitos importantes na programação Java, porque a serialização é usada principalmente na programação de rede. Os objetos que precisam ser transmitidos pela rede precisam ser convertidos em bytes. Para esse propósito, cada classe ou interface deve implementar a interface Serializable . É uma interface de marcador sem nenhum método.

Agora, qual é a palavra-chave transient e sua finalidade?

Por padrão, todas as variáveis ​​do objeto são convertidas em um estado persistente. Em alguns casos, você pode querer evitar a persistência de algumas variáveis, porque você não tem a necessidade de persistir essas variáveis. Então você pode declarar essas variáveis ​​como transient . Se a variável for declarada como transient , ela não será persistida. Esse é o objetivo principal da palavra-chave transient .

Eu quero explicar os dois pontos acima com o seguinte exemplo:

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);
    }
}

E a saída será a seguinte:

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

O nome do meio é declarado como transient , portanto, ele não será armazenado no armazenamento persistente.

Source

java field transient

Por que Java tem campos transitórios ?




Minha pequena contribuição:

O que é um campo transitório?
Basicamente, qualquer campo modificado com a palavra-chave transient é um campo transitório.

Por que os campos temporários são necessários em Java?
A palavra-chave transient fornece a você algum controle sobre o processo de serialização e permite excluir algumas propriedades do objeto desse processo. O processo de serialização é usado para persistir objetos Java, principalmente para que seus estados possam ser preservados enquanto são transferidos ou inativos. Às vezes, faz sentido não serializar certos atributos de um objeto.

Quais campos você deve marcar como transitórios?
Agora sabemos o objetivo dos campos transient palavras-chave e transientes, é importante saber quais campos marcam transitórios. Os campos estáticos também não são serializados, portanto, a palavra-chave correspondente também funcionará. Mas isso pode arruinar seu design de classe; é aí que a palavra-chave transient vem para o resgate. Eu tento não permitir que os campos cujos valores podem ser derivados de outros sejam serializados, então eu os marquei como transitórios. Se você tiver um campo chamado interest cujo valor pode ser calculado a partir de outros campos ( principal , rate e time ), não há necessidade de serializá-lo.

Outro bom exemplo é a contagem de palavras do artigo. Se você estiver salvando um artigo inteiro, não há necessidade de salvar a contagem de palavras, porque ele pode ser calculado quando o artigo é "desserializado". Ou pense em madeireiros; Logger instâncias do Logger quase nunca precisam ser serializadas, para que possam se tornar transitórias.




transient é usado para indicar que um campo de classe não precisa ser serializado. Provavelmente, o melhor exemplo é um campo Thread . Geralmente não há razão para serializar um Thread , pois seu estado é muito "específico do fluxo".




Porque nem todas as variáveis ​​são de natureza serializável




É necessário quando você não deseja compartilhar alguns dados confidenciais que acompanham a serialização.




Simplificando, a palavra-chave java transiente protege os campos da serialização serializada como partes do contador de campos não transientes.

Neste trecho de código, nossa classe abstrata BaseJob implementa a interface Serializable, nós nos estendemos do BaseJob, mas não precisamos serializar as fontes de dados locais e remotas; serialize apenas os campos organizationName e isSynced.

public abstract class BaseJob implements Serializable{
   public void ShouldRetryRun(){}
}

public class SyncOrganizationJob extends BaseJob {

   public String organizationName;
   public Boolean isSynced

   @Inject transient RemoteDataSource remoteDataSource;
   @Inject transient LocalDaoSource localDataSource;

   public SyncOrganizationJob(String organizationName) {
     super(new 
         Params(BACKGROUND).groupBy(GROUP).requireNetwork().persist());

      this.organizationName = organizationName;
      this.isSynced=isSynced;

   }
}



Related