2013-03-04 82 views
1

我在我的web应用程序(使用Spring和Hibernate)中实现分页,在那里我需要类似下面的东西。在Java中的return语句中减少(或增加)运算符

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;在这种情况下?

回答

5

在您的退货声明中,它使用currentPage--,这会导致返回后的递减量。您希望--currentPage在退货之前执行递减操作。就个人而言,像这样复杂的陈述,为了可读性,您可能想要分解它,但这是一个偏好问题。

(从技术上讲,它它的读取之后递减没有什么特别的地方是一个return语句时,它decremements改变。)

如果是到了我,我的口味会做到这一点:

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

} 
+0

但是,由于'--'或'++'什么都不做,编译器可能会产生警告或编译错误。也许findbugs会找到它? – 2013-03-04 22:51:57

+0

@owlstead,但运营商确实做了一些事情。但我确实相信有一个findbugs检查,但是,操作员所做的并不总是程序员希望它做的事情。 – corsiKa 2013-03-04 22:57:56

+0

该方法返回后如何发生递减? – Tiny 2013-03-04 23:07:46

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中包含前缀递减运算符。注意句子:

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

+0

在方法返回后如何发生递减? – Tiny 2013-03-04 23:09:00

+1

该方法返回后不会发生,只是操作'x - '的结果不是'x'的* new *值,而是原始值(在递减之前)。无论如何,变量都是递减的。换句话说,'x - '和'--x'在'x'上执行相同的操作,但是它们返回不同的值。 – arshajii 2013-03-04 23:10:00