zoukankan      html  css  js  c++  java
  • 不可变类小结

    同样是面试遇到的问题,基本想到的final和private之类的都考虑到了,就是没想到深复制和get方法得到副本这些重点

    ps.

    String类就是个不可变类,它的对象一旦创建之后,值就不能被改变了。写这篇的时候看了一遍源码,有时间了自己看下吧,写个String类的分析太长了,,,

    不可变类特点
    1将类声明为final,所以它不能被继承

    public final class ImmutableClass {
    }

    2将所有的成员声明为私有的,这样就不允许直接访问这些成员

    3将所有的成员声明为final,这样只能对它们赋值一次

    public final class ImmutableClass {
    
        private final int id;
    
        private final String name;
    
        private final HashMap testMap;
    }

    4对变量不要提供setter方法,这样就不允许直接修改这些成员

    5在getter方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝

    public final class ImmutableClass {
    
        private final int id;
    
        private final String name;
    
        private final HashMap testMap;
        /**
         * id 是基础类
         */
        public int getId() {
            return id;
        }
    
        /**
         * String 是不可变类直接返回
         */
        public String getName() {
            return name;
        }
    
        /**
         * 可变对象的返回方法
         */
        public HashMap getTestMap() {
            //return testMap;
            return (HashMap) testMap.clone();
        }
    }

    6通过构造器初始化所有成员,进行深拷贝(deep copy)

    public final class ImmutableClass {
    
        private final int id;
    
        private final String name;
    
        private final HashMap testMap;
        /**
         * id 是基础类
         */
        public int getId() {
            return id;
        }
    
        /**
         * String 是不可变类直接返回
         */
        public String getName() {
            return name;
        }
    
        /**
         * 可变对象的返回方法
         */
        public HashMap getTestMap() {
            //return testMap;
            return (HashMap) testMap.clone();
        }
    
        /**
         * 实现深拷贝(deep copy)的构造器
         *
         * @param i
         * @param n
         * @param hm
         */
        public ImmutableClass(int i, String n, HashMap hm) {
            System.out.println("Performing Deep Copy for Object initialization");
            this.id = i;
            this.name = n;
            HashMap tempMap = new HashMap();
            String key;
            Iterator it = hm.keySet().iterator();
            while (it.hasNext()) {
                key = (String) it.next();
                tempMap.put(key, hm.get(key));
            }
            this.testMap = tempMap;
        }
    }
  • 相关阅读:
    POJ 1392 Ouroboros Snake 欧拉回路
    POJ 1275 Cashier Employment 差分约束+二分答案
    POJ 1780 Code 欧拉回路+手写栈DFS
    POJ 1300 Door Man 欧拉路的判断
    HDU1534 Schedule Problem 差分约束
    POJ 3169 Layout 差分约束
    POJ 1364 King 差分约束 找负环
    ZOJ 2770 Burn the Linked Camp 差分约束+SPFA
    Zoj 2027 Travelling Fee 最短路变形
    Poj 2263 Heavy Cargo Floyd 求最大容量路
  • 原文地址:https://www.cnblogs.com/ydymz/p/10069874.html
Copyright © 2011-2022 走看看