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;
    }
}

では、減分演算子 - を使用して値を 1 減らさないのはなぜcurrentPage--ですか? currentPage=currentPage-1;このシナリオでは、なぜそれが必要なのですか?

4

2 に答える 2

5

return ステートメントではcurrentPage--、 return 後にデクリメントを引き起こす which を使用します。--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 に答える