簡體   English   中英

可選參數:多個構造函數導致錯誤

[英]Optional parameters: Multiple constructors cause errors

由於在 Java 可選參數是不可能的,我嘗試創建 2 個構造函數。

public class Tts {
    public Context context;
    private final MediaPlayer _mediaPlayer;
    private final CopyBarVisualizer _barTop;
    private final CopyBarVisualizer _barBottom;

    public Tts(Context context) {
        this.context = context;
    }

    public Tts(Context context, MediaPlayer _mediaPlayer, BarVisualizer _barTop, BarVisualizer _barBottom) {
        this.context = context;
        this._mediaPlayer = _mediaPlayer;
        this._barTop = (CopyBarVisualizer) _barTop;
        this._barBottom = (CopyBarVisualizer) _barBottom;
    }
}

現在我的問題是私有財產。 我得到了錯誤

變量“_mediaPlayer”可能尚未初始化

在另一種方法中,我想檢查是否設置了屬性。 但是我怎樣才能避免這些錯誤呢?

要解決該錯誤,您可以:

刪除屬性中的final關鍵字

public class Tts {
    public Context context;
    private MediaPlayer _mediaPlayer;
    private CopyBarVisualizer _barTop;
    private CopyBarVisualizer _barBottom;

    public Tts(Context context) {
        this.context = context;
    }

    public Tts(Context context, MediaPlayer _mediaPlayer, BarVisualizer _barTop, BarVisualizer _barBottom) {
        this.context = context;
        this._mediaPlayer = _mediaPlayer;
        this._barTop = (CopyBarVisualizer) _barTop;
        this._barBottom = (CopyBarVisualizer) _barBottom;
    }
}

為您的最終屬性提供默認null

public class Tts {
    public Context context;
    private final MediaPlayer _mediaPlayer; 
    private final CopyBarVisualizer _barTop; 
    private final CopyBarVisualizer _barBottom; 

    public Tts(Context context) {
        this(context, null, null, null); // to solve the error problem
    }

    public Tts(Context context, MediaPlayer _mediaPlayer, BarVisualizer _barTop, BarVisualizer _barBottom) {
        this.context = context;
        this._mediaPlayer = _mediaPlayer;
        this._barTop = (CopyBarVisualizer) _barTop;
        this._barBottom = (CopyBarVisualizer) _barBottom;
    }
}

此代碼來自@Khahani


對於 class 中的可選屬性,您可以使用Builder 模式

public class TtsBuilder{
    public Context context;
    private MediaPlayer _mediaPlayer = null;
    private BarVisualizer _barTop = null;
    private BarVisualizer _barBottom = null;

    public TtsBuilder(Context context) {
        this.context = context;
    }

    public TtsBuilder withMediaPlayer(MediaPlayer _mediaPlayer) {
        this._mediaPlayer = _mediaPlayer;
        return this;
    }

    public TtsBuilder withBarTop(BarVisualizer _barTop) {
        this._barTop = _barTop;
        return this;
    }

    public TtsBuilder withBarBottom(BarVisualizer _barBottom) {
        this._barBottom = _barBottom;
        return this;
    }

    public Tts build() {
        return new Tts(context, _mediaPlayer, _barTop, _barBottom);
    }
}

例子:

public static void main(String[] args){
    Tts ttsMedia = new Tts(aContext).withMediaPlayer(aMediaPlayer).build();
    Tts ttsBarTopBottom = new Tts(aContext)
            .withBarTop(aBarTop)
            .withBarBottom(aBarBottom)
            .build();
}

筆記

Java 中的命名約定建議:

變量名稱不應以下划線 _ 或美元符號 $ 字符開頭,即使兩者都允許。

有關更多詳細信息,您可以查看Oracle 文檔

如果你想解決錯誤問題,你可以用下面的代碼修復它; 但是,當構造函數初始化 final 字段時,您無法更改它們,因此最好刪除 final 關鍵字。

public class Tts {
    public Context context;
    private final MediaPlayer _mediaPlayer; 
    private final CopyBarVisualizer _barTop; 
    private final CopyBarVisualizer _barBottom; 

    public Tts(Context context) {
        this(context, null, null, null); // to solve the error problem
    }

    public Tts(Context context, MediaPlayer _mediaPlayer, BarVisualizer _barTop, BarVisualizer _barBottom) {
        this.context = context;
        this._mediaPlayer = _mediaPlayer;
        this._barTop = (CopyBarVisualizer) _barTop;
        this._barBottom = (CopyBarVisualizer) _barBottom;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM