繁体   English   中英

java配置/参数传递设计

[英]java configuration/parameter passing design

我经常发现需要设计具有可配置功能的对象。

举个例子,假设我正在创建一个DateIterator 可配置选项可能是迭代闭合间隔[start, end]还是开放端间隔[start, end)


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

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

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

我会说Builder模式在这里有意义:

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

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

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

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

同样,这些是我使用的经验法则,绝不是强制性的,而且我经常发现自己不会逐字尊重它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM