【问题标题】:How can transient variables be used in a class that implements Parcelable?如何在实现 Parcelable 的类中使用瞬态变量?
【发布时间】:2019-06-23 08:56:04
【问题描述】:

我需要了解实现 Parcelable 接口的类中的瞬态变量是否应该在 modelClass(Parcel parcel) 方法中从 parcel 中读取或写入 writeToParcel(Parcel包裹,int i) 。任何人都可以为我提供一个包含瞬态变量的类实现。谢谢。

【问题讨论】:

    标签: java android class parcelable transient


    【解决方案1】:

    “transient”-关键字对可包裹对象没有影响。读取和写入可包裹对象中的字段没有自动化,因此没有现成的代码可以考虑到这一点。瞬态字段的特殊处理的任何可能选择完全取决于设计类的人。

    规范 (https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.3.1.3) 说“变量可能被标记为瞬态,以表明它们不是对象的持久状态的一部分”,所以如果你真的想照书看书,你应该不要写它们。但是,正如我所说,由于读写是在类内部机械地完成的,transient 关键字没有多大意义。

    【讨论】:

    • 在实现 parcelable 时,有两个方法称为 writeToParcel 和从 parcel 读取。我怀疑是否应该将瞬态数据写入将被序列化的包裹。由于读取包裹总是以用空值填充瞬态变量结束,因此是否有必要将瞬态写入包裹?
    • 读取包裹不会将瞬态变量填充为空。创建对象实例会将其初始化为 null(或该类型的任何默认值),然后读取包裹只会使其保持初始化后的状态。
    【解决方案2】:
    class Employee implements Serializable {
        private String firstName;
        private String lastName;
        private transient String confidentialInfo;
    
        //Setters and Getters
    }
    

    【讨论】:

    • 在将此类传递给其他类之前,如果其他线程接近它并更改值会发生什么?
    【解决方案3】:

    您可以在声明变量时简单地在数据类型前添加瞬态关键字。

    class Parcel implements Parcelable{
       private Integer checkinId;
       private transient String someCode;
    
       //// some methods
    }
    
    interface Parcelable implements{
      // some methods
    }
    

    【讨论】:

    • 在实现 parcelable 时,有两个方法称为 writeToParcel 和从 parcel 读取。我怀疑是否应该将瞬态数据写入将被序列化的包裹。由于读取包裹总是以用空值填充瞬态变量结束,因此是否有必要将瞬态写入包裹?
    猜你喜欢
    • 2012-01-22
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    相关资源
    最近更新 更多