Question

I am looking for some efficient way for building a immutable class, just like Java's String class.

Was it helpful?

Solution

  1. All the fields must be private and preferably final
  2. Ensure the class cannot be overridden - make the class final, or use static factories and keep constructors private
  3. Fields must be populated from the Constructor/Factory
  4. Don't provide any setters for the fields
  5. Watch out for collections. Use Collections.unmodifiable*. Also, collections should contain only immutable Objects
  6. All the getters must provide immutable objects or use defensive copying
  7. Don't provide any methods that change the internal state of the Object.

Tom Hawtin pointed out that final can be optional. String class has a cache hash var that is only assigned when the hash function is called.

OTHER TIPS

If you populate all fields using the constructor and make the fields final - you are partway there.

If the fields use custom types - you may need to make them immutable as well.

Any fields that are collections should use the unmodifiable collections - to be on the safe side.

You need to worry about the object graph!

Any methods on the object need to take care with non-final fields. E.g. String.add creates a new String. If you need to mutate one field - do so via a copy constructor.

Finally make the object final.

An object is immutable if none of its fields can be modified, so those fields must be final. If you don't want your object to be subclassed, you can make the class itself final as well, just like String is. To easily construct an immutable object with a lot of information, you should look at the Factory Pattern

For more information, see Wikipedia

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top