ŤHearticlewas在itiallypublisHedatcarlØscHac。in
ØckquØte>也可以看看:
☕️一成不变的s/AutoValue/大号ombok🔥WhichOne?
CarlosChacin☕👽・Apr13・5minread
#java
#bestpractices
#immutability
InEffectiveJava,JoshuaBlochmakesthefollowingrecommendation:
除非有充分的理由使它们可变,否则类应该是不可变的。如果不能使一个类不可变,则应尽可能限制其可变性。
🔩一成不变的宾语s
如果对象在构造后无法改变,则认为该对象是不可变的。对不可变对象的最大依赖被广泛认为是创建简单,可靠代码的合理策略。reference
- Immutableobjectsareconstructedonce,inaconsistentstate,andcanbesafelyshared
- Willfail如果mandatory属性aremissing
- Cannotbesneakilymod如果iedwhenpassedtoothercode
- Immutableobjectsarenaturallythread-safeandcanthere对于ebesafelysharedamongthreads
- Noexcessivecopying
- Noexcessivesynchronization
- 宾语definitionsarepleasanttowriteandread
- Noboilerplatesetterand得到ters
- NouglyIDE-generated
杂凑Code
,等于
andto串
methodsthatendupbeingstoredinsourcecontrol。reference
🔧大号et'sconvertamutableobject整型oanimmutableone(byhand✋):
ŤhefollowingclassiswhatweusuallycallPOJOorJavaBean:
进口java。util。日期;进口java。util。清单;进口java。util。对象;上市class旧模型{私人的串领域A;私人的日期领域B;私人的长领域C;私人的清单和lt;串和gt;领域;上市旧模型(){}上市串得到FieldA(){返回领域A;}上市虚空setFieldA(串领域A){这个。领域A=领域A;}上市日期getFieldB(){返回领域B;}上市虚空setFieldB(日期领域B){这个。领域B=领域B;}上市长getFieldC(){返回领域C;}上市虚空setFieldC(长领域C){这个。领域C=领域C;}上市清单和lt;串和gt;getFieldD(){返回领域;}上市虚空setFieldD(清单和lt;串和gt;领域){这个。领域=领域;}@Override上市串to串(){返回“旧模型{”+“领域A='”+领域A+'\''+“,领域B=”+领域B+“,领域C=”+领域C+“,field=”+领域+'}';}@Override上市布尔值等于(宾语o){如果(这个==o)返回真正;如果(o==空值||getClass()!=o。getClass())返回假;旧模型旧模型=(旧模型)o;返回对象。等于(getFieldA(),旧模型。getFieldA())&&对象。等于(getFieldB(),旧模型。getFieldB())&&对象。等于(getFieldC(),旧模型。getFieldC())&&对象。等于(