Java中return语句中的减量(或增量)运算符
我在我的web应用程序中实现分页(使用Spring和Hibernate),在这里我需要如下内容Java中return语句中的减量(或增量)运算符,java,Java,我在我的web应用程序中实现分页(使用Spring和Hibernate),在这里我需要如下内容 public static int deleteSingle(long totalRows, long pageSize, int currentPage) { return totalRows==currentPage*pageSize-pageSize ? currentPage-- : currentPage; } 假设我从某处调用这个方法,如下所示 deleteSingle(24, 2
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;
}
}
public static int deleteSingle(长totalRows、长pageSize、int currentPage)
{
如果(totalRows==currentPage*pageSize pageSize)
{
currentPage=currentPage-1;//在您的return语句中,它使用了currentPage--
,这会导致返回后的减量。您希望--currentPage
在返回前进行减量。就个人而言,对于这样一个复杂的语句,出于可读性的考虑,您可能无论如何都想将其打破,但这是一个错误优先权
(从技术上讲,它在读取后会递减。当它递减时,返回语句会发生变化,这并没有什么特别之处。)
如果由我决定,我的口味是:
public static int deleteSingle(long totalRows, long pageSize, int currentPage)
{
if(totalRows==currentPage*pageSize-pageSize)
{
currentPage--;
}
return currentPage;
}
在return语句中,它使用了-currentPage--
,这会导致返回后的减量。您希望--currentPage
在返回前进行减量。就个人而言,对于这样一个复杂的语句,出于可读性的考虑,您可能无论如何都想将其分解,但这是一个偏好问题
(从技术上讲,它在读取后会递减。当它递减时,返回语句会发生变化,这并没有什么特别之处。)
如果由我决定,我的口味是:
public static int deleteSingle(long totalRows, long pageSize, int currentPage)
{
if(totalRows==currentPage*pageSize-pageSize)
{
currentPage--;
}
return currentPage;
}
请注意,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
正如所料
public static int deleteSingle(long totalRows, long pageSize, int currentPage)
{
if(totalRows==currentPage*pageSize-pageSize)
{
currentPage=currentPage-1; //<-------
return currentPage; //<-------
}
else
{
return currentPage;
}
}
但是,您不认为简单地使用currentPage-1
会更好吗?在这种情况下,没有理由重新分配currentPage
(请记住,这样的重新分配在方法范围之外是不可见的)
前缀减量运算符包含在JLS的中。请注意以下句子:
前缀减量表达式的值是存储新值后的变量值
请注意,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
正如所料
public static int deleteSingle(long totalRows, long pageSize, int currentPage)
{
if(totalRows==currentPage*pageSize-pageSize)
{
currentPage=currentPage-1; //<-------
return currentPage; //<-------
}
else
{
return currentPage;
}
}
但是,您不认为简单地使用currentPage-1
会更好吗?在这种情况下,没有理由重新分配currentPage
(请记住,这样的重新分配在方法范围之外是不可见的)
前缀减量运算符包含在JLS的中。请注意以下句子:
前缀减量表达式的值是存储新值后的变量值
尽管如此,由于--
或++
什么也不做,编译器可能会创建警告或编译错误。也许findbugs会找到它?@owlstead,但操作符确实做了一些事情。我相信有一个findbugs检查,不过,操作符所做的并不总是程序员希望它做的。减量怎么可能在方法返回后发生?因为currentPage
只是内存中某个地方的一个数字。考虑到它是一个参数,并且在返回后无法读取,所以减小它是毫无用处的,但它确实发生了。(优化器很可能会实际删除执行它的字节码,但从逻辑上讲,没有理由认为它不会被递减,而只是被零访问。)尽管如此,由于--
或++
什么也不做,编译器可能会创建警告或编译错误。也许findbugs会找到它?@owlstead,但操作符确实做了一些事情。我相信有一个findbugs检查,不过,操作符所做的并不总是程序员希望它做的。减量怎么可能在方法返回后发生?因为currentPage
只是内存中某个地方的一个数字。考虑到它是一个参数,并且在返回后无法读取,所以减小它是毫无用处的,但它确实发生了。(优化器很可能会实际删除执行它的字节码,但从逻辑上讲,没有理由认为它不会被递减,而只是被零访问。)减量怎么可能在方法返回后发生?它不会在方法返回后发生,只是操作的结果x--
不是x
的新值,而是原始值(减量前)。变量将被递减。换句话说,x--
和--x
对x
执行相同的操作,但它们返回不同的值。减量怎么可能在方法返回后发生?它不会在方法返回后发生,只是操作的结果x--
不是x
的新值,而不是原始值(减量之前)。变量将被减量。换句话说,x--
和--x
对x
执行相同的操作,但返回不同的值。