1

我在我的 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;
    }
}

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

4

2 回答 2

5

在您的 return 语句中,它使用currentPage--which 导致 return 后的递减。您想--currentPage在返回之前进行减量。就个人而言,对于这样一个复杂的语句,为了便于阅读,您可能无论如何都想将其分解,但这是一个偏好问题。

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

如果由我决定,我的口味会是这样:

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

}
于 2013-03-04T22:45:32.093 回答
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 节介绍了前缀减量运算符。注意句子:

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

于 2013-03-04T22:45:51.933 回答