1

最終変数 がありますsave。これは、いくつかの情報のシリアル化可能なクラスです。私がやろうとしたことは、そのシリアル化可能なクラスとして最終変数を設定することですが、競合する警告がいくつか表示されます。ファイルがロードできない/存在しない場合は、単に新しいインスタンスを作成し、そうでない場合は古いインスタンスを使用するようにしようとしています。

私の問題は、コンストラクターの開始、終了、および ObjectInputStream からのオブジェクトの読み取り時にコードでコメントされています。

private final CannonSet save;


public CannonManager(ManCannon plugin) { // Warning that save is not initialized
    if (/* some conditional statement */) {
        //lot of code removed, unnecessary to problem
        //essentially, save was set conditionally here (loaded from file)
        this.save = new CannonSet();
    }
    if (this.save == null) {
        this.save = new CannonSet(); // Warning that save may have already been set
    }
}
4

3 に答える 3

2

最終変数に対してこれを行うことはできません:

if (this.save == null) {
    this.save = new CannonSet(); // Warning that save may have already been set
}

が初期化されていて、この場合saveにのみ比較nullが可能な場合は、再割り当てできません。

条件付きロジックは最終変数で可能であり、多くの場合、次のようになります。

final CannonSet save;

if(condition1){
    save = new CannotSet(1);
} else
if(condition2){
    save = new CannotSet(2);
} else {
    save = new CannotSet(3); 
}
于 2013-10-25T17:17:47.877 に答える
2

完全なメソッドスコープで一時オブジェクトを宣言し、this.save代わりにチェックしている下部でnullかどうかをテストしてから、割り当てを行う必要があるようです。基本的に、インスタンス フィールドを割り当てる場所は 1 行のみです。あなたのコードから省略:

public CannonManager(ManCannon plugin) {
    CannonSet temp = null;
    try{
       // stuff happens
       temp = (CannonSet) in.readObject();
    }catch( ... ){
       // exception handling
    }
    if(temp == null){
       this.save = new CannonSet();
    }else{
       this.save = temp;
     }
 }
于 2013-10-25T17:19:35.517 に答える
1

コンストラクター全体で一時変数を使用すると、これがはるかに簡単になることがわかりました。

private final CannonSet save;

public CannonManager(ManCannon plugin) {
    CannonSet temp = null;
    /* code .... */
    if (temp == null) {
        this.save = new CannonSet();
    } else {
        this.save = temp;
    }
}
于 2013-10-25T17:20:28.747 に答える