java配置/参数传递设计

java配置/参数传递设计,java,configuration,parameter-passing,Java,Configuration,Parameter Passing,我经常发现需要设计具有可配置功能的对象 举例来说,假设我正在创建一个DateIterator。可配置选项可能是迭代闭合间隔[start,end]还是迭代开放间隔[start,end) (1)在我看来,这是一个不公平的解决方案-仅限于一个真/假配置选项 new DateIterator(boolean openInterval); (2)类型安全枚举方式-通常有点笨重 new DateIterator(Interval.OPEN_END); (3)非传统的尝试——不错,但不太直截了当 new

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

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


  • (1)在我看来,这是一个不公平的解决方案-仅限于一个真/假配置选项
    new DateIterator(boolean openInterval);
    
    • (2)类型安全枚举方式-通常有点笨重
      new DateIterator(Interval.OPEN_END);
      
      • (3)非传统的尝试——不错,但不太直截了当
        new DateIterator().openEnd();
        
        继承方法——通常是过度工程化
        new OpenEndedDateIterator();
        

        这是一些我认为是劣等的选择,如基于整数的配置<代码>新的数据迭代器(Studio .OpenYEnter);< /C>或基于属性的配置。


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

        我认为构建器模式在这里很有意义:

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

        这样,您的实际DateIterator可以是不可变的,而由
        DateIterator.builder()
        返回的生成器执行配置工作。

        虽然没有好的答案,这主要是一个品味问题,但我确实遵循以下经验法则,为异常留出了大量空间,以避免过度工程化:

      • 如果您仅有的配置是一个“参数”,使用一个固定的集合并改变行为(如您的示例中所示),则使用子类。虽然它可能设计过度,但如果类中的许多方法以“If(this.parameter==x)…else If(this.parameter==y)…开头,则会使代码无法读取
      • 如果您的参数不是一个固定的集合,而是一个字符串或数字,并且您需要它才能使类正常工作,请将其放入构造函数中,如果它不是强制性的,则我喜欢解决方案编号(3),非常规的尝试:)
      • 如果你在固定集中有不止一个参数(比如StasePosixFieldEnter和StutopOpenFipe),创建子类可能意味着为每个置换创建一个子类。在这种情况下,考虑封装。例如,在这个特定的情况下,我可能不会这样做,但这是一个很好的例子。,创建一个类DateComparator,其中一个子类用于open-end,封装一个DateComparator用于start,一个用于end,只有一个DateIterator
      • 同样,这些都是我使用的经验法则,不是强制性的,而且我发现自己经常不一字不差地尊重它们