java配置/参数传递设计

时间:2011-08-29 12:32:48

标签: java configuration parameter-passing

我经常发现需要使用可配置功能来设计对象。

举例说明,假设我正在创建DateIterator。可配置选项可能是迭代关闭区间 [start, end] 还是开放区间 [start, end)


  • (1)在我看来,不合理的解决方案 - 仅限于一个 true / false 配置选项
new DateIterator(boolean openInterval);
  • (2)类型安全的枚举方式 - 通常有点笨重
new DateIterator(Interval.OPEN_END);
  • (3)非传统的尝试 - 很好但不太直接
new DateIterator().openEnd();
  • (4)继承方法 - 经常过度工程
new OpenEndedDateIterator();

对于这个,有一些我认为较差的选择,如基于整数的配置new DateIterator(Interval.OPEN_END);或基于属性的配置。

还有其他方法吗?您更喜欢哪种方法?

2 个答案:

答案 0 :(得分:6)

我认为Builder模式在这里有意义:

DateIterator di = 
  DateIterator.builder()
              .withStartDate(new Date())
              .withOpenEnd()
              .build();

这样你的实际DateIterator可以是不可变的,而DateIterator.builder()返回的构建器可以完成配置。

答案 1 :(得分:1)

虽然没有好的答案,而且主要是品味问题,但我确实遵循以下经验法则,为避免过度工程设置了大量的例外空间:

  1. 如果您拥有的唯一配置是一个“参数”,采用固定集合并改变行为(如您的示例中所示),请使用子类。虽然它可能过度设计,但如果你的类中的许多方法都以“if(this.parameter == x)... else if(this.parameter == y)..”开头,那么它将使代码无法读取。 / LI>
  2. 如果你的参数不是一个固定的集合,而是一个字符串或数字,并且你需要它让它正常工作,把它放在构造函数中,如果它不是强制性的,我喜欢解决方案编号(3),非常规尝试: )
  3. 如果固定集中有多个参数(如START_OPEN_ENDED和STOP_OPEN_ENDED),则创建子类可能意味着为每个排列创建一个子类。在这种情况下考虑封装。例如(我可能不会在这个特定情况下这样做,但这是一个很好的例子),创建一个单独的DateComparator类,带有一个开放式的子类,并封装一个DateComparator用于开始,一个用于结束,只有一个DateIterator。
  4. 同样,这些是我使用的经验法则,绝不是强制性的,而且我经常发现自己不会逐字尊重它们。