准备超级构造函数的参数

时间:2011-03-22 09:40:31

标签: java constructor super

我有一个必须用参数构造的基类。在子类中,我需要在构造基类之前准备这个参数,但是在Java中必须先调用super。处理这种情况的最佳方法是什么(见下面的简单示例)。

class BaseClass {
    protected String preparedParam;

    public BaseClass(String preparedParam) {
        this.param = param;
    }
}

class ChildClass {

    public ChildClass (Map<String, Object> params) {
        // need to work with params and prepare param for super constructor
        super(param);
    }
}

4 个答案:

答案 0 :(得分:11)

您可以创建一个 静态 方法,进行转换并调用它。

class ChildClass {

    static String preprocessParams(Map<String, Object> params) {
        ...
        return someString;
    }

    public BaseClass(Map<String, Object> params) {
        super(preprocessParams(params));
    }
}

答案 1 :(得分:5)

这是一种方法:

class ChildClass {
    public ChildClass(Map<String, Object> params) {
        super(process(params));
    }

    private static String process(Map<String, Object> params) {
         // work with params here to prepare param for super constructor
    }
}

答案 2 :(得分:2)

因为许多必须准备/初始化的参数对我来说是简单的factory method更好的解决方案。在我看来,这是一个更清晰的解决方案。无论如何,谢谢大家的答案。

class BaseClass {
  protected Object preparedParam;

  public BaseClass(Object preparedParam) {
    this.preparedParam = preparedParam;
  }
}

class ChildClass extends BaseClass {

  private ChildClass(Object preparedParam) {
    super(preparedParam);
  }

  public static ChildClass createChildClass(Map<String, Object> params) {
    Object param1 = params.get("param1");

    // prepare params here

    ChildClass result = new ChildClass(param1);

    // do other stuff

    return result;
  }
}

答案 3 :(得分:0)

到目前为止,我认为罗曼的回答是最好的。 如果父类提供了默认构造函数,则可以实例化一个super对象,然后使用setter方法。