扩展 Button 类以创建单例

Rob*_*bb1 1 java singleton android button

我想扩展Button该类以创建一个名为“ ”的单例类,该类LabeledButton也有一个String名为label.

到目前为止,我得到了:

static public class LabeledButton extends Button {
    String label;

    private LabeledButton(String label) {
        this.label = label;
    }

    static public LabeledButton getInstance(String label) {
        if(current == null)
            current = new LabeledButton(label);
        return current;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }
}
Run Code Online (Sandbox Code Playgroud)

但这就是我在构造函数中得到的错误:

“android.widget.Button”中没有可用的默认构造函数

我究竟做错了什么?

Aka*_*dav 5

Default Constructor是没有任何参数的构造函数,并且在没有其他构造函数被提及的情况下由 Java 编译器隐式引入

每当您扩展任何给定类时,在创建对象时首先调用父类构造函数。在 Parent 类不提供无参数构造函数的情况下,您必须明确说明要调用哪个参数化的构造函数。

如错误中所述

There is no default constructor available in 'android.widget.Button'
Run Code Online (Sandbox Code Playgroud)

在当前上下文中,由于您正在扩展 Button,它恰好没有默认(无参数)构造函数。

Button(Context context)
Button(Context context, AttributeSet attrs)
Button(Context context, AttributeSet attrs, int defStyleAttr)
Button(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
Run Code Online (Sandbox Code Playgroud)

是唯一暴露的。 Android 按钮文档

因此,您必须显式调用参数化构造函数之一。

public class LabeledButton extends Button {
    String label;

    public LabeledButton(Context context, String label) {
        super(context);  // Explicitly Invoking the parent parameterized constructor 
        this.label = label;
    }
}
Run Code Online (Sandbox Code Playgroud)