2015-05-03 2 views
-3

Чтобы сделать одноэлементный класс, который реализован с использованием любого из предыдущих , подходит к сериализуемым (глава 11), недостаточно просто добавить imple- Ment Serializable к его объявлению. Чтобы сохранить синглтонную гарантию, вы должны: : объявить все поля экземпляра переходным и предоставить метод readResolve (п. 77). В противном случае, каждый раз, когда сериализованная экземпляр десериализируется, новый экземпляр будет созданЗачем объявлять все экземпляры полей преходящими в одиночных играх?

Что приводит к моему вопросу: почему объявить все инстанции полей переходными? Я думаю, что readResolve достаточно! мой вопрос: почему автор сказал, что мы shuold объявить все поля экземпляра преходящее в синглетонов

package com.effective.test; 

import java.io.Serializable; 

public class NormalBean implements Serializable { 

    private static final long serialVersionUID = 1L; 
    private transient int id; 

    /** 
    * no matter declare transient or not...nothing is different!why author say that?? 
    */ 
    private/* transient */String name; 

    private NormalBean(int id, String name) { 
     this.id = id; 
     this.name = name; 
    } 

    private static final NormalBean INSTANCE = new NormalBean(12345,"jack"); 

    public static NormalBean getInstance() { 
     return INSTANCE; 
    } 

    /* 
    * The readResolve method is called when ObjectInputStream has read an 
    * object from the stream and is preparing to return it to the caller. 
    * ObjectInputStream checks whether the class of the object defines the 
    * readResolve method. If the method is defined, the readResolve method is 
    * called to allow the object in the stream to designate the object to be 
    * returned. 
    * 
    * And in Singleton case we are returning the same instance that was created 
    * while classloading and no new instances are returned. So singletonness is 
    * maintained. 
    */ 
    private Object readResolve() { 
     return INSTANCE; 
    } 

    @Override 
    public String toString() { 
     return "NormalBean [id=" + id + ", name=" + name + ", getClass()=" + getClass() + ", hashCode()=" + hashCode() 
       + "]"; 
    } 
} 

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 

public class TestTransientPlusReadResolve { 
     NormalBean bean=NormalBean.getInstance() ; 
    public void writeAndRead() throws IOException { 
     ObjectOutputStream outStream = new ObjectOutputStream(new FileOutputStream("writeAndRead.txt")); 
     System.out.println("this is the one "+bean); 

     outStream.writeObject(bean); 
     outStream.close(); 
     try { 
      Thread.sleep(500l); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("writeAndRead.txt")); 

     try { 
      NormalBean backBean = (NormalBean) inputStream.readObject(); 
      System.out.println("this is the one "+backBean); 

      System.out.println("still the One?"+(backBean==bean)); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     }finally{ 
      inputStream.close(); 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     new TestTransientPlusReadResolve().writeAndRead(); 
    } 

} 

Выход:

this is the one NormalBean [id=12345, name=jack, getClass()=class com.effective.test.NormalBean, hashCode()=366712642] 

    this is the one NormalBean [id=12345, name=jack, getClass()=class com.effective.test.NormalBean, hashCode()=366712642] 

    still the One?true 
+0

Почему объявить все экземпляры полей преходящими? Я думаю, что readResolve достаточно! – user3003728

+0

Как сохранить экземпляр в следующем случае: загрузить jvm, записать класс в файл, выгрузить jvm, загрузить jvm, перезагрузить класс из файла? – engineercoding

+0

Мой вопрос: почему автор сказал, что мы shuold объявляем все экземпляры полей переходными в одиночных точках – user3003728

ответ

0

Я не думаю, что любой вопрос будет выделить, если использовать его в один JVM (класс будет содержать ссылку для статического экземпляра singleton, независимо от того, как вы его сериализуете). Возможно, перезапуск после сериализации и чтение файла поможет, но я думаю, что загрузка классов должна произойти до десериализации.

У этого также есть оценка эффективности. Если вам не нужно сериализовать значения полей, потому что они одинаковы для одноэлементного, почему вы его сериализуете, то, например, отправьте его по сети, затем выполните readResolve, чтобы проигнорировать полученные вами значения?

+0

мой вопрос: почему автор сказал, что мы shuold объявляем все экземпляры полей переходными в одиночных точках – user3003728

0

(Глава 11)

Глава 11 чего?

Чтобы сохранить одноплодную гарантию, вы должны объявить все поля экземпляра переходную

Нет у вас нет. Для обеспечения однопользовательской гарантии не требуется внесение переменных экземпляра transient. Обеспечение метода readResolve() является достаточным.

мой вопрос: почему автор сказал, что мы shuold объявить все поля экземпляра преходящий одиночек

Какой автор? Автор чего? Где он это сказал? Каковы были его точные слова? Какой у Вас вопрос?

Возможно, он предположил, что в качестве улучшения производительности, поскольку сериализация данных, которые не будут использоваться, является пустой тратой времени и пространства.

-1

Если вы помечаете переменную экземпляра как переходную, вы сообщаете JVM пропустить (игнорировать) эту переменную при попытке сериализации содержащего ее объекта. Сериализация - одна из самых классных функций Java; он позволяет сохранить (иногда называемый «сгладить») объект, записав его состояние (другими словами, значение его экземпляра переменных) в специальный тип потока ввода-вывода.С сериализацией вы можете сохранить объект в файл или даже отправить его на провод для повторного вращения (десериализации) на другом конце, в другой JVM.

 Смежные вопросы

  • Нет связанных вопросов^_^