减少子类构造函数中的代码重复

时间:2014-11-23 12:40:55

标签: java android inheritance constructor

所以这就是情况。我正在使用Java扩展一个类,我需要提供3个构造函数,分别包含1,2和3个参数。

public class MessageButton extends ImageButton {
    private String number;

    public MessageButton(Context context) {
        super(context);
    }

    public MessageButton(Context context, AttributeSet attrs) {
        super(context, attrs);

        if( attrs.getAttributeValue("uk.co.gsteinert.ssbb", "number") != null ) {
            this.number = attrs.getAttributeValue("uk.co.gsteinert.ssbb", "number");
        }
    }

    public MessageButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        if( attrs.getAttributeValue("uk.co.gsteinert.ssbb", "number") != null ) {
            this.number = attrs.getAttributeValue("uk.co.gsteinert.ssbb", "number");
        }
    }
}

显然那里有一些重复(在最后两个构造函数中),我想减少它。

我看到两个选项:

  1. 将代码移动到setup()函数中,并从每个构造函数中调用它。这减少了重复的代码,但仍需要在每个构造函数中调用。
  2. 在除最后一个构造函数之外的所有构造函数中使用this()。唯一的问题是可选参数的默认值不为null。我需要检查超类的来源以确定要使用的值。
  3. 所以我看待它的方式,无论是我必须复制代码(函数调用)还是对超类(默认值)做出假设。我知道这些都不太理想,但哪个是更​​大的邪恶?

    或者我错过了什么?

    由于

3 个答案:

答案 0 :(得分:0)

您可以使用this

从另一个构建函数调用(不创建新实例)
public MyClass(String value) {
  ....
}

public MyClass() {
  this(defaultValue);
}

答案 1 :(得分:0)

public class MessageButton extends ImageButton {
    private String number;

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

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

    public MessageButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        if(attrs!=null){
            if( attrs.getAttributeValue("uk.co.gsteinert.ssbb", "number") != null ) {
               this.number = attrs.getAttributeValue("uk.co.gsteinert.ssbb", "number");
        }
        }}
}

答案 2 :(得分:0)

正如您所提到的,我将对所有构造函数使用this()并检查在父类中使用哪些默认值并提供那些而不是null(在此示例中使用)。您正在将此类用于自定义代码,因此您应该知道默认值是什么值。

public class MessageButton extends ImageButton {

    private String number;

    public MessageButton(Context context) {
        this(context, null);
    }

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

    public MessageButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        if (attrs.getAttributeValue("uk.co.gsteinert.ssbb", "number") != null) {
            this.number = attrs.getAttributeValue("uk.co.gsteinert.ssbb", "number");
        }
    }
}