field @transient que - ¿Por qué Java tiene campos transitorios?




6 Answers

Antes de entender la palabra clave transient , uno tiene que entender el concepto de serialización. Si el lector conoce la serialización, omita el primer punto.

¿Qué es la serialización?

La serialización es el proceso de hacer que el estado del objeto sea persistente. Eso significa que el estado del objeto se convierte en un flujo de bytes y se almacena en un archivo. De la misma manera, podemos usar la deserialización para recuperar el estado del objeto de los bytes. Este es uno de los conceptos importantes en la programación de Java porque la serialización se utiliza principalmente en la programación en red. Los objetos que deben transmitirse a través de la red deben convertirse en bytes. Para ese propósito, cada clase o interfaz debe implementar la interfaz Serializable . Es una interfaz de marcador sin ningún método.

Ahora, ¿cuál es la palabra clave transient y su propósito?

De forma predeterminada, todas las variables del objeto se convierten en un estado persistente. En algunos casos, es posible que desee evitar la persistencia de algunas variables porque no tiene la necesidad de persistir esas variables. Así que puedes declarar esas variables como transient . Si la variable se declara como transient , entonces no se persistirá. Ese es el propósito principal de la palabra clave transient .

Quiero explicar los dos puntos anteriores con el siguiente ejemplo:

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

Y la salida será la siguiente:

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

El segundo nombre se declara como transient , por lo que no se almacenará en el almacenamiento persistente.

Source

es variables modificador

¿Por qué Java tiene campos transitorios ?




Mi pequeña contribución:

¿Qué es un campo transitorio?
Básicamente, cualquier campo modificado con la palabra clave transient es un campo transitorio.

¿Por qué se necesitan campos transitorios en Java?
La palabra clave transient le da cierto control sobre el proceso de serialización y le permite excluir algunas propiedades de objeto de este proceso. El proceso de serialización se utiliza para persistir los objetos Java, principalmente para que sus estados puedan conservarse mientras se transfieren o están inactivos. A veces, tiene sentido no serializar ciertos atributos de un objeto.

¿Qué campos debes marcar transitorios?
Ahora que conocemos el propósito de la palabra clave transient y los campos transitorios, es importante saber qué campos marcar transitorios. Los campos estáticos tampoco están serializados, por lo que la palabra clave correspondiente también funcionaría. Pero esto podría arruinar el diseño de tu clase; aquí es donde la palabra clave transient viene al rescate. Intento no permitir que los campos cuyos valores se pueden derivar de otros se serialicen, por lo que los marca como transitorios. Si tiene un campo llamado interest cuyo valor puede calcularse a partir de otros campos ( principal , rate y time ), no es necesario serializarlo.

Otro buen ejemplo es con el número de palabras del artículo. Si está guardando un artículo completo, realmente no hay necesidad de guardar el recuento de palabras, ya que puede calcularse cuando el artículo se "deserializa". O piensa en los madereros; Logger instancias del Logger casi nunca necesitan ser serializadas, por lo que pueden hacerse transitorias.




transient se utiliza para indicar que un campo de clase no necesita ser serializado. Probablemente el mejor ejemplo sea un campo Thread . Generalmente no hay razón para serializar un Thread , ya que su estado es muy 'específico del flujo'.




Porque no todas las variables son de carácter serializable.




Antes de responder a esta pregunta, debo explicarle la SERIALIZACIÓN , porque si entiende lo que significa la serialización en una computadora científica, puede comprender fácilmente esta palabra clave.

Serialización Cuando un objeto se transfiere a través de la red / se guarda en un medio físico (archivo, ...), el objeto debe ser "serializado". Serialización convierte la serie de objetos de estado de bytes. Estos bytes se envían en la red / se guardan y el objeto se vuelve a crear a partir de estos bytes.
Ejemplo

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

Ahora, SI QUIERES NO TRANSFERIR / GUARDAR el campo de este objeto SO , puedes usar la palabra clave transient

private transient attr2;

Example




según el significado transitorio de Google == que dura solo un corto tiempo; impermanente.

Ahora si quieres hacer algo transitorio en java usa una palabra clave transitoria.

Q: donde usar transitorio?

R: Generalmente en java podemos guardar datos en archivos adquiriéndolos en variables y escribiendo esas variables en archivos, este proceso se conoce como serialización. Ahora, si queremos evitar que los datos variables se escriban en un archivo, haríamos esa variable como transitoria.

resultado int transitorio = 10;

Nota: las variables transitorias no pueden ser locales.






Related