Почему у Java есть временные поля? - PullRequest
1345 голосов
/ 26 мая 2009

Почему у Java есть переходные поля?

Ответы [ 13 ]

0 голосов
/ 05 июня 2019

Упрощенный пример кода для переходного ключевого слова.

import java.io.*;

class NameStore implements Serializable {
    private String firstName, lastName;
    private transient String fullName;

    public NameStore (String fName, String lName){
        this.firstName = fName;
        this.lastName = lName;
        buildFullName();
    }

    private void buildFullName() {
        // assume building fullName is compuational/memory intensive!
        this.fullName = this.firstName + " " + this.lastName;
    }

    public String toString(){
        return "First Name : " + this.firstName
            + "\nLast Name : " + this.lastName
            + "\nFull Name : " + this.fullName;
    }

    private void readObject(ObjectInputStream inputStream)
            throws IOException, ClassNotFoundException
    {
        inputStream.defaultReadObject();
        buildFullName();
    }
}

public class TransientExample{
    public static void main(String args[]) throws Exception {
        ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("ns"));
        o.writeObject(new NameStore("Steve", "Jobs"));
        o.close();

        ObjectInputStream in = new ObjectInputStream(new FileInputStream("ns"));
        NameStore ns = (NameStore)in.readObject();
        System.out.println(ns);
    }
}
0 голосов
/ 14 ноября 2017

Проще говоря, временное ключевое слово java защищает поля от Serialize как счетчик их непереходных полей.

В этом фрагменте кода наш абстрактный класс BaseJob реализует интерфейс Serializable, который мы расширяем от BaseJob, но нам не нужно сериализовать удаленные и локальные источники данных; сериализовать только поля organizationName и 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;

   }
}
0 голосов
/ 02 ноября 2014

Согласно Google переходный смысл == длящийся только в течение короткого времени; непостоянно.

Теперь, если вы хотите сделать что-то временное в java, используйте ключевое слово transient.

Q: где использовать переходный процесс?

A: Обычно в Java мы можем сохранять данные в файлы, собирая их в переменные и записывая эти переменные в файлы, этот процесс известен как сериализация. Теперь, если мы хотим избежать записи переменных данных в файл, мы бы сделали эту переменную переходной.

transient int result=10;

Примечание: временные переменные не могут быть локальными.

...