0

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

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

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);
    }
}
4

1 回答 1

4

不,它绝对不是一成不变的。您的lengthandbreadth字段不是私有的或只读的,因此此代码将起作用:

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

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

如果您字段设为私有并避免在您的类中修改它们,或者使它们成为最终的,(最好)两者兼而有之,那么您所展示的类型将是不可变的。但它不会阻止可变子类 - 您应该同时将类设为 final 来做到这一点。

于 2012-04-20T07:28:11.773 回答