避免空值,不变性,对象状态

Jas*_*Jas 2 java oop immutability

我喜欢不变性的概念.我也喜欢no nulls的概念(如果可能的话,也没有NullDesignPattern,尽可能没有NullObjects).

但是下面的场景呢:

我有一个对象User,它有两个字段:birthdaydateInLifeMarried(可以是任何类似的字段;重要的是,这个字段最初是null在对象生命中的某个点上改变).

由于它是不可变的,我希望两个字段都在构造函数中:

public User(birthday, dateInLifeMarried)
Run Code Online (Sandbox Code Playgroud)

现在:

  1. 我不想传递null给第二个参数
  2. 我不想添加一个setter因为它是不可变的
  3. 我不想用NullObjectPattern调用构造函数而不是 null

我只是自相矛盾,还是有一种优雅的方式来拥有它,我没有想到的?

Jon*_*eet 13

那么你需要考虑你想要的表示 - 而不仅仅是构造函数签名.我怀疑你需要使用该字段为空引用(或至少类似的东西).但是你可以有两个构造函数:

User(birthday)               // Unmarried user
User(birthday, marriageDate) // Married user; marriageDate must not be null
Run Code Online (Sandbox Code Playgroud)

作为API的用户,我不确定我是否真的喜欢它 - 我想我宁愿允许marriageDate为空.特别是,必须写下来会很烦人:

LocalDate marriageDate = getMarriageDateOrNull();
User user = marriageDate == null ? new User(birthday)
                                 : new User(birthday, marriageDate);
Run Code Online (Sandbox Code Playgroud)

或者,因为人们可以不止一次结婚,你可以随时拿一个Iterable<LocalDate> marriageDates,然后一个从未结婚的用户将有一个空序列:)(你需要考虑已婚 - 然后离婚和已婚 - 然后 - 丧偶的用户虽然建模现实生活很难.)