将 Short.MAX_VALUE 递增(溢出)为零,而不是Short.MIN_VALUE



我正在处理一个应用程序中的"tabindex"缺陷,该缺陷在FirefoxChrome中运行良好,但不能在Internet Explorer中运行良好。 "tabindex"通过JSP由静态"int"设置,每次使用时都会递增。

private static short tabIndex = 1;
sb.append("<select tabindex='").append(tabIndex++) ...

Internet Explorer的最大"标签索引"为 32767 (Short.MAX_VALUE)。所以我可以将int更改为short,但是在达到最大值后,它会滴答作响到Short.MIN_VALUE.

具有负 tabIndex 的对象将从 Tab 键顺序中省略。

所以我需要它从Short.MAX_VALUE进步到零。 显然,编写一些代码来执行此操作是微不足道的,但我想知道是否有一些聪明的速记方法可以增加到严格的正数,或者我可以使用的其他数据类型。

您可以通过将值与0x7FFF一起确保 MSB 始终为 0

short s = 32767;
short s1 = (short)(s & 0x7FFF); // s1 = 32767 (or 0x7FFF)
s++; // s = -32768 (or 0x8000)
short s2 = (short)(s & 0x7FFF); // s2 = 0

您可能希望将增量和位掩码提取到其自己的方法中,并在append中使用它。

我不宽恕这段代码,因为它不是很清楚,坦率地说,从分配中返回不是我会使用的东西,但以下内容将是一个非常简短的版本:

public short incIndex() {
return tabIndex = (short)(tabIndex+1 & 0x7FFF);
}

...append(incIndex())...

为什么不创建我们自己的包装器类型来处理这个限制呢?

public class ShortValueForTab {
private short value;       
public short next() {
value++;
if (value < 0) {
value = 0;
}
return value;
}
}

在您的客户端代码中:

private static ShortValueForTab tabIndex =  new ShortValueForTab();
...    
sb.append("<select tabindex='").append(tabIndex.next()) ...

相关内容

  • 没有找到相关文章

最新更新