为什么我要在不可变类中将所有字段标记为私有?

时间:2015-10-27 14:36:46

标签: java immutability

来自JDK文档:

  

不要提供" setter" methods - 修改字段或对象的方法   字段提到。使所有字段成为最终和私有。不要允许   子类重写方法。最简单的方法是   将该类声明为final。更复杂的方法是制作   构造函数private和在工厂方法中构造实例。如果   实例字段包括对可变对象的引用,不允许   那些要改变的对象:不要提供修改的方法   可变对象。不要共享对可变对象的引用。决不   存储对传递给的外部可变对象的引用   构造函数;如有必要,创建副本,并存储对的引用   副本。同样,在创建内部可变对象的副本时   必须避免在方法中返回原件。

示例:

final public class ImmutableRGB {

    // Values must be between 0 and 255.
    final private int red;
    final private int green;
    final private int blue;
    final private String name;

    private void check(int red,
                       int green,
                       int blue) {
        if (red < 0 || red > 255
            || green < 0 || green > 255
            || blue < 0 || blue > 255) {
            throw new IllegalArgumentException();
        }
    }

    public ImmutableRGB(int red,
                        int green,
                        int blue,
                        String name) {
        check(red, green, blue);
        this.red = red;
        this.green = green;
        this.blue = blue;
        this.name = name;
    }


    public int getRGB() {
        return ((red << 16) | (green << 8) | blue);
    }

    public String getName() {
        return name;
    }

    public ImmutableRGB invert() {
        return new ImmutableRGB(255 - red,
                       255 - green,
                       255 - blue,
                       "Inverse of " + name);
    }
}

请解释为什么我应该将字段标记为私有?

0 个答案:

没有答案