1

我希望这不是一个愚蠢的问题。
拥有 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

4 回答 4

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);
    }
于 2013-04-28T14:47:57.547 回答
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);
    }

你可以这样使用

于 2013-04-28T14:48:52.213 回答
0

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

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

于 2013-04-28T14:53:47.293 回答
0

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

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) { ... }
于 2013-04-28T15:04:43.283 回答