繁体   English   中英

基本构造函数链接调用

[英]Basic constructor chaining calls

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

最好的方法是使用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);
    }

您无需创建其他方法,您尊重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);
    }

你可以用这种方式

我建议将通用代码放在参数最多的构造函数中,并从其他(参数较少的构造函数)构造函数中调用该构造函数,当然还要为现在缺少的参数提供一些默认值(您可以使用this(...)链接相同的类构造函数) this(...)声明)。 如果要扩展的超类经过适当设计,则应该能够通过链接(使用super(...)语句)使用参数最多的构造函数来调用参数最多的构造函数。

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

好吧,将通用代码放入构造函数中,并确保从其他构造函数调用它,并注意最后一个参数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) { ... }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM