Possible ways of making an Object immutable

混江龙づ霸主 提交于 2019-12-12 08:16:42

问题


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


回答1:


  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.




回答2:


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.




回答3:


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



来源:https://stackoverflow.com/questions/1017140/possible-ways-of-making-an-object-immutable

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!