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

时间:2015-03-15 00:07:58

标签: java multithreading class immutability mutable

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; }       }

上述类中的对象是不可变的吗?说明。 我很困惑,因为 没有设置器,所以没有什么可以修改对象 但 它没有应该包含的最终变量或最终类。

如果类被扩展,它可以添加不可变的额外字段,或者可以重写方法以每次返回不同的值。这不会使这个类不可变吗?

3 个答案:

答案 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)

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