不可移动的对象创建

时间:2012-04-20 07:26:43

标签: java class immutability

这是一个不可移动的课吗? 一个不可变的类是否有必要是最终的?

我有一个不可移动的盒子类,对盒子的更改应该会创建一个新的盒子。

public class MyImmutableBox {
    Integer length;
    Integer breadth;

    /*Constructor*/

    public MyImmutableBox(Integer length,Integer breadth){
        this.length=length;
        this.breadth=breadth;
    }

    /*Getters*/ 

    public Integer getBreadth() {
        return breadth;
    }
    public Integer getLength() {
        return length;
    }

    /*Member functions*/

    /*Changing entire box size*/
    public MyImmutableBox changeMyBoxSize(Integer lengthToBeAltered,Integer breadthToBeAltered){
        return new MyImmutableBox(length+lengthToBeAltered,breadth+breadthToBeAltered);
    }

    /*Changing either length otr breadth*/  

    public MyImmutableBox changeMyBoxLenth(Integer lengthToBeAltered){
        return new MyImmutableBox(length+lengthToBeAltered,breadth);
    }

    public MyImmutableBox changeMyBoxBreadth(Integer breadthToBeAltered){
        return new MyImmutableBox(length,breadth+breadthToBeAltered);
    }
}

1 个答案:

答案 0 :(得分:4)

不,这绝对不是一成不变的。您的lengthbreadth字段不是私有或只读,因此此代码可以使用:

MyImmutableBox box = new ImmutableBox(5, 3);
box.length = 10;
box.breadth = 20;

(顺便说一下,为什么你使用Integer而不是int并不清楚。)

如果您 将字段设为私有并避免在您的类中修改它们,将它们设为最终字段,(最好)两者,然后你所显示的类型将是不可变的。但它不会阻止可变子类 - 你应该同时使类最终完成。