以下class中的对象是不可变的吗?

Are the objects in the following class immutable?

public class Point {
       private double x;
       private double y;
       Point (double x, double y) 
       { this.x = x; this.y = y; }
       double getX() { return x; }
       double getY() { return y; }       }

上面class中的对象是不可变的吗?解释。 我很困惑,因为 没有设置器,所以没有任何东西可以修改对象 但 没有它应该包含的 final 变量或 final class 。

如果 class 得到扩展,它可能会添加额外的不可变字段,或者这些方法可能会被重写为 return 每次不同的值。这不会使 class 不可变吗?

是的,它们是不可变的。你可以在这里读到它 http://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html

是的,因为您无法访问数据成员并且您没有更改数据成员的方法

If the class gets extended, ... the methods could be overridden to return a different value each time. Doesn't this make the class not immutable?

你的问题很微妙。如果某些 class MutPoint extends Point 并将 getX()getY() 方法覆盖为 return 非常量值,则不会更改 Point class 本身. Point sill 的实例实际上是不可变的,但允许调用者将 MutPoint 对象传递给需要 Point 参数的 您的 方法。那么会发生什么?取决于您如何编写代码。 可能 如果调用者给你一个 Point-like 对象然后改变它的 "value".

你的代码会表现得很糟糕

如果您使用 Point 对象的代码要求它们永不更改,那么您可能想要声明整个 class final

public final class Point { ... }

这样,您的客户端将不允许覆盖 class,并且不允许使用除实际 Point 实例以外的任何内容调用您的方法。