0

我在 ejb 部分有一个方法,它必须增加实体的简单整数值并将更改保存到 db 中。我无法让它工作,因为它总是打印相同的值!

这是代码:

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 会递增,然后将值传递给方法。后者显然是你想要的。

这是需要小心走捷径的领域之一;

如果你做了

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

那么你就不会遇到这个问题了。

于 2012-05-07T11:05:32.447 回答