java - 使类不可变

标签 java immutability

我正在学习不可变对象(immutable对象)。我必须让下面的类(class)不可变。我做对了吗?

import java.awt.Point;
public class MyImmutablePoint {
    Point point;

    public MyImmutablePoint(Point point) {
        super();
        this.point = point;
    }

    public MyImmutablePoint() {
        this (new Point (0,0));
    }

    public Point getPoint() {
        return point;
    }

    public void setPoint(Point point) {
        this.point = point
    }
}

“不可变”类:

public final class MyImmutablePoint {
    private final Point point;

    public MyImmutablePoint(Point point) {
        this.point = point;
    }

    public MyImmutablePoint() {
        this (new Point (0,0));
    }

    public Point getPoint() {
        return point;
    }   
}

虽然我不确定 toString 方法。 也许返回一个像 Point 这样的对象也可以像数组一样被修改,但不确定

最佳答案

没有

final Point p = new Point(0,0);
final ImmutablePoint ip = new ImmutablePoint(p);

两个例子:

//change the original Point passed in
p.x = 10
//use the getter and change the Point
ip.getPoint().x = 10

因此,首先您需要创建构造函数中获取的Point防御副本:

public MyImmutablePoint(Point point) {
    this.point = new Point(point);
}

然后您需要创建从 getter 返回的 Point 的防御副本:

public Point getPoint() {
    return new Point(point);
}

这一切让我建议最好不要暴露内部 point:

public final class MyImmutablePoint {

    private final Point point;

    public MyImmutablePoint(Point point) {
        this.point = new Point(point);
    }

    public MyImmutablePoint() {
        this.point = new Point (0,0);
    }

    public int getX() {
        return point.x;
    }

    public int getY() {
        return point.y;
    }
}

进一步格式化您的代码订购您的成员

关于java - 使类不可变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34176732/

相关文章:

java - 如何使用Java实现华为分块文件上传

Scala - vals 的初始化顺序

python - open(file, "wt"或 "rt") 是不同的对象吗?

java - NaN 形式的长值

java - 为什么android SQLite可以将 double 值(java 8字节)存储到浮点列中

c++ - 使用哪种类型的指针来实现对集合元素的共享访问?

c++ - 如何通过不可变类型的 "pipeline"传递信息

clojure - 在 clojure : explanation of the internals 中关联

java - Branch vs Tag.. 来自 SVN 世界

java - 实例化自己的类时编译器如何处理Main