0

エンティティの単純な整数値をインクリメントし、変更をdbに永続化する必要があるメソッドがejb部分にあります。常に同じ値を出力するため、動作させることができません。

コードは次のとおりです。

public void incrementDownloads(Dispensa dispensa) {
    int dl = dispensa.getDownloads();
    System.out.println(dispensa.getTitolo() + " had " + dl + " downloads");
    dispensa.setDownloads(dl++);
    dispensaFacade.edit(dispensa);        
    dispensa = dispensaFacade.refresh(dispensa);
    System.out.println("now it has " + dispensa.getNumDownloads());
}

dispensaFacade使用されるメソッドは、自動生成されたメソッドからのものですAbstractFacade

public void edit(T entity) {
    getEntityManager().merge(entity);
}

public T refresh(T entity){
    T res = getEntityManager().merge(entity);
    getEntityManager().refresh(res);
    return res;
}

私のコードは印刷されます:

タイトル1のダウンロード数は0でした

今では0です

これは明らかに間違っています!

どこが間違っているのですか?

4

1 に答える 1

1

単独で使用する場合、すなわち

++i;
// or
i++;

前後のインクリメント演算子は機能的に同等です。ただし、あなたの場合、それらをメソッドパラメータとして使用しており、違いが明らかになります。

これが問題を説明することを願っているいくつかのコードです。

public static void main(String[] args) {
    int i = 0;
    printPassedValue(i++);
    System.out.println("i = " + i);
    printPassedValue(++i);
    System.out.println("i = " + i);
}


private static void printPassedValue(int value) {
    System.out.println("Passed value: " + value);
}

このコードを実行すると、

Passed value: 0
i = 1
Passed value: 2
i = 2

ご覧のとおり、このようにポストインクリメントを使用する場合(つまりi ++)、iの値はiがインクリメントされる前にメソッドに渡されます。ただし、プリインクリメント(++ i)を使用する場合は、iがインクリメントされてから、値がメソッドに渡されます。後者は明らかにあなたが望むものです。

これは、ショートカットを慎重に使用する必要がある領域の1つです。

あなたがやったなら

dl++;  // or ++dl;
dispensa.setDownloads(dl);

そうすれば、この問題は発生しません。

于 2012-05-07T11:05:32.447 に答える