美文网首页
第 89 条:对于实例控制,枚举类型优先于 readResolv

第 89 条:对于实例控制,枚举类型优先于 readResolv

作者: 综合楼 | 来源:发表于2022-12-19 17:05 被阅读0次
对于实例控制,枚举类型优先于 readResolve.jpeg
// Broken singleton - has nontransient object reference field!
public class Elvis implements Serializable {
    public static final Elvis INSTANCE = new Elvis();
    private Elvis() { }
    private String[] favoriteSongs = { "Hound Dog", "Heartbreak Hotel" };
    public void printFavorites() {
        System.out.println(Arrays.toString(favoriteSongs));
    }
    private Object readResolve() {
        return INSTANCE;
    }
}
class ElvisStealer implement Serializable{
    static Elvis impersonator;
    private Elvis payload;
    private Object readResolve(){
        impersonator = payload;
        return new String[]{"foolish"};
    }
}
public class ElvisImpersonator {
    // Byte stream couldn't have come from a real Elvis instance!
    private static final byte[] serializedForm = {
        (byte)0xac, (byte)0xed, 0x00, 0x05, 0x73, 0x72, 0x00, 0x05,
        0x45, 0x6c, 0x76, 0x69, 0x73, (byte)0x84, (byte)0xe6,
        (byte)0x93, 0x33, (byte)0xc3, (byte)0xf4, (byte)0x8b,
        0x32, 0x02, 0x00, 0x01, 0x4c, 0x00, 0x0d, 0x66, 0x61, 0x76,
        0x6f, 0x72, 0x69, 0x74, 0x65, 0x53, 0x6f, 0x6e, 0x67, 0x73,
        0x74, 0x00, 0x12, 0x4c, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x6c,
        0x61, 0x6e, 0x67, 0x2f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
        0x3b, 0x78, 0x70, 0x73, 0x72, 0x00, 0x0c, 0x45, 0x6c, 0x76,
        0x69, 0x73, 0x53, 0x74, 0x65, 0x61, 0x6c, 0x65, 0x72, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01,
        0x4c, 0x00, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64,
        0x74, 0x00, 0x07, 0x4c, 0x45, 0x6c, 0x76, 0x69, 0x73, 0x3b,
        0x78, 0x70, 0x71, 0x00, 0x7e, 0x00, 0x02
    };
    public static void main(String[] args) {
        // Initializes ElvisStealer.impersonator and returns
        // the real Elvis (which is Elvis.INSTANCE)
        Elvis elvis = (Elvis) deserialize(serializedForm);
        Elvis impersonator = ElvisStealer.impersonator;
        elvis.printFavorites();
        impersonator.printFavorites();
    }
}
// Enum singleton - the preferred approach
public enum Elvis {
    INSTANCE;
    private String[] favoriteSongs = { "Hound Dog", "Heartbreak Hotel" };
    public void printFavorites() {
        System.out.println(Arrays.toString(favoriteSongs));
    }
}

相关文章

  • 89. 对于实例控制,枚举类型优于 readResolve

    89. 对于实例控制,枚举类型优于 readResolve 第 3 条讲述了 Singletion(单例)模式,并...

  • Effective Java 随笔——第3、4条

    第3条:用私有构造器或者枚举类型强化Singleton属性 Singleton指仅仅被实例化一次的类,通常被用来代...

  • java中enum枚举类型

    枚举类型常用方法:values()返回枚举类型定义数组ordinal()返回实例在枚举类型定义的次序,默认从0开始...

  • 第十一章 方法

    与c++类似,也是有实例方法和类型方法。 对于结构体、枚举,由于它们是值类型,因此不能在实例方法中修改属性值。 实...

  • 方法(Method)

    枚举 结构体 类都可以定义实例方法,类型方法 实例方法(Instance Method):通过实例对象调用 类型方...

  • Swift语法 -- [09 - 方法]

    枚举、结构体、类都可以定义实例方法、类型方法 实例方法(Instance Method):通过实例对象调用 类型方...

  • Swift-OOP-Method

    枚举、结构体、类都可以定义实例丰富、类型丰富 实例方法:通过实例对象调用 类型方法:通过类型调用,用static或...

  • effective java 第三周

    第6章 枚举和注解 第30条:用 enum 代替 int 常量 在没有 enum 之前表示枚举类型的常用模式时声...

  • Swift中的方法、下标与继承

    方法 特点 枚举、结构体、类都可以定义实例方法、类型方法 实例方法:通过实例调用 类型方法:通过类型调用,用sta...

  • JavaScript中的Enum枚举类型数据

    一、枚举类型介绍 1、枚举类型 如果接触过其它语言或者TypeScript,大概对于枚举类型有一些了解。枚举类型是...

网友评论

      本文标题:第 89 条:对于实例控制,枚举类型优先于 readResolv

      本文链接:https://www.haomeiwen.com/subject/glzesltx.html