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; } }
上述类中的对象是不可变的吗?说明。 我很困惑,因为 没有设置器,所以没有什么可以修改对象 但 它没有应该包含的最终变量或最终类。
如果类被扩展,它可以添加不可变的额外字段,或者可以重写方法以每次返回不同的值。这不会使这个类不可变吗?
答案 0 :(得分:2)
如果类被扩展,...可以重写方法以每次返回不同的值。这不会使这个类不可变吗?
你的问题很微妙。如果某些class MutPoint extends Point
并覆盖getX()
和getY()
方法以返回非常量值,则不会更改Point
类本身。 Point
sill的实例将是有效的不可变的,但是调用者可以将MutPoint
个对象传递给您希望Point
个参数的方法。那么会发生什么?取决于你如何编写代码。如果调用者给你一个类似Point的对象,然后随后改变了它的“值”,它就可能你的代码表现不好。
如果使用Point
对象的代码要求它们永远不会更改,那么您可能希望声明整个类final
public final class Point { ... }
这样,您的客户端将不被允许覆盖该类,并且不允许使用除实际Point
实例之外的任何其他方法调用您的方法。
答案 1 :(得分:0)
是的,它们是不可改变的。你可以在这里读到它 http://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html
答案 2 :(得分:0)
是的,因为您无法访问数据成员,并且您没有更改数据成员的方法