can please tell me defensive copying in terms of reference parameter constructor of class in java
thanks sooooo much
given can extract question, guess problem can summarized follows...
let start this:
class notsafeatall { private final list<x> list; public notsafeatall(final list<x> list) { this.list = list; } }
this class has huge problem: copies list reference member field. means if caller of constructor modifies list, changes reflected in notsafeatall
instance well.
and "defensive copying" comes play. consider:
class alittlemoresafe { private final list<x> list; public alittlemoresafe(final list<x> list) { this.list = new arraylist<x>(list); } }
now, class has own copy of list; if caller modifies list has passed argument constructor, alittlemoresafe
instance not affected.
but story not end here, of course. consider there method in latter class return list has received parameter:
class alittlemoresafe { private final list<x> list; public alittlemoresafe(final list<x> list) { list = new arraylist<x>(list); } public list<x> unsafegetlist() { return list; } }
you lose! if constructor safe, fact return reference internal list; , caller can modify list via reference.
here again, defensive copy can save you, there better solution: ensure list return immutable:
public list<x> safegetlist() { return collections.unmodifiablelist(list); }
any attempt of caller modify returned list fail.
so, story over?
no.
it can on if x
instances immutable. unfortunately, classical, , overused, bean pattern guarantees that. story.
Comments
Post a Comment