在Java中的return语句中递减(或递增)运算符

时间:2013-03-04 22:43:41

标签: java

我在我的Web应用程序(使用Spring和Hibernate)中实现了分页,我需要的东西如下所示。

public static int deleteSingle(long totalRows, long pageSize, int currentPage)
{
   return totalRows==currentPage*pageSize-pageSize ? currentPage-- : currentPage;
}

假设,我从以下某处调用此方法。

deleteSingle(24, 2, 13);

使用这些参数,条件得到满足,并且应该返回变量currentPage(即13)减1(即12)的值,但它不会递减currentPage的值。它返回此调用后的原始值13。


我必须像下面那样更改方法,以使其按预期工作。

public static int deleteSingle(long totalRows, long pageSize, int currentPage)
{
    if(totalRows==currentPage*pageSize-pageSize)
    {
        currentPage=currentPage-1;   //<-------
        return currentPage;          //<-------
    }
    else
    {
        return currentPage;
    }
}

那么为什么不用递减运算符将值减1呢currentPage--?为什么在这种情况下需要currentPage=currentPage-1;

2 个答案:

答案 0 :(得分:5)

在你的return语句中,它使用currentPage--导致返回后的减量。您希望--currentPage在返回之前执行减量。就个人而言,有了这样一个复杂的陈述,你可能想要为了可读性而打破它,但这是一个偏好的问题。

(从技术上讲,它会在读完后递减。没有什么特别的,它是一个在递减时会发生变化的返回语句。)

如果由我决定,我的意思是这样做:

public static int deleteSingle(long totalRows, long pageSize, int currentPage)
{
    if(totalRows==currentPage*pageSize-pageSize)
    {
        currentPage--;
    }
    return currentPage;

}

答案 1 :(得分:4)

请注意x--在使用其值后递减x ,您可能需要--currentPage,这会在之前递减变量使用它的价值。


要看到这一点,请考虑:

public static int deleteSingle(long totalRows, long pageSize, int currentPage) {
    try {
        return totalRows == currentPage * pageSize - pageSize ? currentPage--
                    : currentPage;
    } finally {
        System.out.println("*" + currentPage);  // value after return
    }
}

调用deleteSingle(24, 2, 13)打印:

*12
13

如果我们将currentPage--替换为--currentPage,我们会收到:

*12
12

正如所料。

但是,您认为仅仅使用currentPage - 1会不会更好?在这种情况下,没有理由重新分配 currentPage(请记住,这种重新分配在方法范围之外是不可见的。)


前缀减量运算符包含在JLS的§15.15.2中。注意这句话:

  

前缀减量表达式的值是存储新值后变量的值。