【问题标题】:Calling different super() in constructor depending on arguments根据参数在构造函数中调用不同的 super()
【发布时间】:2014-03-26 00:14:40
【问题描述】:

我有一个扩展另一个类的类。在构造函数中,我传入了一堆参数,但现在我意识到我需要根据运行代码的对象传入不同的参数:

public searchPage(WebDriver driver, LoadableComponent<?> parent, Properties props) {
    super(driver, parent, Boolean.FALSE, props,action.UK);

在此示例中,该操作使用枚举中的 UK 值,我的问题是如果我在另一个客户端上运行它,我可能需要调用 action.FR

有没有办法在构造函数中添加条件?例如,如果 prop 文件中的某些内容显示为 FR,则传递 action.FR

【问题讨论】:

  • 定义两个不同的构造函数怎么样?将区分因子作为参数传递。
  • 工厂函数?你可以把条件放在工厂里。不知道这是不是最好的选择,但这似乎很简单。

标签: java constructor conditional-statements extends super


【解决方案1】:

通过constructor 传递enum 值不是更有意义吗?这样,无论用户输入什么,相同的构造函数都会起作用。

示例

public searchPage(WebDriver driver, LoadableComponent<?> parent, Properties props, Country country) {
    super(driver, parent, Boolean.FALSE, props, country);
}

// Assumes Country is your enum type. Was just a guess for a placeholder.

【讨论】:

    【解决方案2】:

    super() 调用之前不能有条件,因为它必须是第一个。另一方面,该语言不会阻止在调用中使用表达式,因此您可以:

    super(driver, parent, Boolean.FALSE, props, getAction(props));
    

    getAction() 类似于:

    private Action getAction(Properties props) {
        ...
    

    请注意,为了安全起见,您不希望 getAction() 可以被子类覆盖,因此它应该是私有的、最终的或静态的。 (否则,根据 Murphy 的说法,有人会根据未完全初始化对象的状态来实现一个。

    也就是说,最好改用工厂模式之类的东西。

    【讨论】:

      【解决方案3】:

      因为构造函数调用(在本例中为 super())需要在构造函数中首先调用 - 不,你不能。

      解决这个问题的方法可以是例如制作两个不同的构造函数。

      【讨论】:

        【解决方案4】:

        我觉得你可以在这里使用 Builder 模式。当构造函数中的参数数量很多时,建议使用 Builder 模式。

        客户端代码将指定他想要使用的操作类型。对于builder模式,see

        您的客户端代码如下所示:

        SearchPageBuilder builder = new SearchPage.SearchPageBuilder();
        builder.setDriver(driver);
        builder.setLoadableComponent(parent);
        builder.setProperties(props);
        builder.setAction(action.UK);
        SearchPage page = builder.build();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-17
          • 1970-01-01
          • 1970-01-01
          • 2013-02-18
          相关资源
          最近更新 更多