Jas*_*Jas 2 java oop immutability
我喜欢不变性的概念.我也喜欢no nulls的概念(如果可能的话,也没有NullDesignPattern,尽可能没有NullObjects).
但是下面的场景呢:
我有一个对象User,它有两个字段:birthday和dateInLifeMarried(可以是任何类似的字段;重要的是,这个字段最初是null在对象生命中的某个点上改变).
由于它是不可变的,我希望两个字段都在构造函数中:
public User(birthday, dateInLifeMarried)
现在:
null给第二个参数null我只是自相矛盾,还是有一种优雅的方式来拥有它,我没有想到的?
Jon*_*eet 13
那么你需要考虑你想要的表示 - 而不仅仅是构造函数签名.我怀疑你将需要使用该字段为空引用(或至少类似的东西).但是你可以有两个构造函数:
User(birthday)               // Unmarried user
User(birthday, marriageDate) // Married user; marriageDate must not be null
作为API的用户,我不确定我是否真的喜欢它 - 我想我宁愿允许marriageDate为空.特别是,必须写下来会很烦人:
LocalDate marriageDate = getMarriageDateOrNull();
User user = marriageDate == null ? new User(birthday)
                                 : new User(birthday, marriageDate);
或者,因为人们可以不止一次结婚,你可以随时拿一个Iterable<LocalDate> marriageDates,然后一个从未结婚的用户将有一个空序列:)(你需要考虑已婚 - 然后离婚和已婚 - 然后 - 丧偶的用户虽然建模现实生活很难.)