以下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
实例以外的任何内容调用您的方法。
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
实例以外的任何内容调用您的方法。