美文网首页
第 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 条:对于实例控制,枚举类型优先于 readResolv

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