0

これは不変クラスですか?不変クラスが final である必要はありますか?

immuable になるボックスクラスがあります。ボックスを変更すると、新しいボックスが作成されます。

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

いいえ、それは間違いなく不変ではありません。あなたのフィールドlengthbreadthフィールドはプライベートでも読み取り専用でもないので、このコードは機能します:

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

(ちなみに、なぜIntegerではなくを使用しているのかは明らかではありませんint。)

フィールドをプライベートにしてクラス内での変更を避ける、finalにするか、またはできれば)両方の場合、表示したタイプは不変になります。ただし、可変サブクラスを防ぐことはできません。それを行うには、同時にクラスをfinalにする必要があります。

于 2012-04-20T07:28:11.773 に答える