基本构造函数链接调用

时间:2013-04-28 14:41:23

标签: java constructor

我希望这不是一个愚蠢的问题 有3个基本构造函数

public MyClass(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    // TODO Auto-generated constructor stub
}

public MyClass(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}

public MyClass(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
}

首先调用super类构造函数。那么它是否意味着我必须将所有常见的构造函数代码放入这样的私有方法中?:

public MyClass(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    common(context);
}

public MyClass(Context context, AttributeSet attrs) {
    super(context, attrs);
    common(context);
}

public MyClass(Context context) {
    super(context);
    common(context);
}

private void common(Context context) { ... }

我虽然可以将构造函数链接到公共代码,但是我得到一个错误,说构造函数调用必须是代码中的第一个语句。

public MyClass(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this(context, attrs);
}

public MyClass(Context context, AttributeSet attrs) {
    super(context, attrs);
    // Some code
    this(context);
}

public MyClass(Context context) {
    super(context);
    // Some more code
}

第一个语句是超级构造函数调用或类构造函数调用,不能两者都有。

Constructor call must be the first statement in a constructor

4 个答案:

答案 0 :(得分:6)

最好的方法是使用this() - 你不需要创建一个新方法,并且你尊重DRY原则(不要重复自己)

    public MyClass(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
      // your code here
    }

    public MyClass(Context context, AttributeSet attrs) {
       // Assuming 0 is the default value of defStyle, else pass the default value
       this(context, attrs, 0);
    }

    public MyClass(Context context) {
        // Assuming null is the default value for attrs
        this(context, null);
    }

答案 1 :(得分:3)

您不必创建另一种方法,您尊重DRY原则并且很容易。

 public MyClass(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
      // your code here
    }
    public MyClass(Context context, AttributeSet attrs) {
       this(context, attrs,null);
    }
    public MyClass(Context context) { 
        this(context,null,null);
    }

你可以这样使用

答案 2 :(得分:0)

我建议将公共代码放在最可参数化的构造函数中,并从其他每个(可参数化较少的)构造函数中调用该构造函数,当然对于现在缺少的参数使用一些默认值(您可以使用{链接相同的类构造函数) {1}}声明)。如果您正在扩展的超类是正确设计的,那么您应该能够使用最具参数化的构造函数通过链接(使用this(...)语句)调用其最具参数化的构造函数。

如果这不适用于您的情况,那么私有方法是处理此问题的一种非常好的方法,尝试进一步解决它通常没有任何好处。

答案 3 :(得分:0)

好吧,将公共代码放在构造函数中,并确保从其他每个构造函数调用它来处理最后一个参数int defStyle,我假设0是默认的defStyle。

public MyClass(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    common(context);
}

public MyClass(Context context, AttributeSet attrs) {
    this(context, attrs,0);
}

public MyClass(Context context) {
    this(context,null,0);
}

private void common(Context context) { ... }