Is the below class immutable:
final class MyClass {
private final int[] array;
public MyClass(int[] array){
this.array = array;
}
}
Immutable objects are particularly useful in concurrent applications. Since they cannot change state, they cannot be corrupted by thread interference or observed in an inconsistent state.
The only real disadvantage of immutable classes is that they require a separate object for each distinct value. Creating these objects can be costly, especially if they are large.
More detailed answer: Yes serialization can break immutability. You have to remember that serialization is another way of creating objects (and it is not using constructors).
"Immutability" is a convention between the programmer and himself. That convention may be more or less enforced by the compiler.
Instances of a class are "immutable" if they do not change during the normal course of the application code execution. In some cases we know that they do not change because the code actually forbids it; in other cases, this is just part of how we use the class. For instance, a java.util.Date
instance is formally mutable (there is a setTime()
method on it) but it is customary to handle it as if it were immutable; this is just an application-wide convention that the Date.setTime()
method shall not be called.
As additional notes:
String
is documented to be immutable (that's what the Javadoc says). But if you look at the source code, you will see that a String
instance contains a private field called hash
which may change over time: this is a cache for the value returned by hashCode()
. We still say that String
is immutable because the hash
field is an internal optimization which has no effect visible from the outside.final
), if the programmer wishes so hard enough. Not that it is a good idea: it may break assumptions used by other pieces of code using the said instance. As I said, immutability is a convention: if the programmer wants to fight himself, then he can, but this can have adverse side-effects on productivity...MyClass
instance ? There is no generic answer to that question.No it is not because the elements of the array can still be changed.
int[] v1 = new int[10];
MyClass v2 = new MyClass(v1);
v1[0] = 42; // mutation visible to MyClass1
My two cents regarding immutability rules (which I retained from reading Effective Java - a great book!):
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With