2013-03-04 84 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